diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index a1a4b77..464062d 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -16,11 +16,6 @@
    This was not originally supported by Cobalt, and any prior use of animated
    WebP with transparency would have resulted in visual artifacts.
 
- - **Improvements and Bug Fixes**
-   - Fix pointer/mouse events not being dispatched to JavaScript in the same
-     order that they are generated by Starboard, relative to other input events
-     like key presses.
-
  - **Storage format changed from sqlite3 to protobuf**
 
    Cobalt's internal representation for persistent storage of cookies and local
@@ -49,11 +44,23 @@
    implement voice-enabled features without relying on the platform's capability
    to perform speech recognition.
 
- - **Bison 2 deprecation**
+ - **Bison 3 required**
 
    Support for compiling with version 2.x of the GNU bison parser generator
-   has been deprecated and will be removed in this version. Please upgrade
-   to bison 3.x.
+   has been removed. Please update to version 3.x.
+
+ - **Improvements and Bug Fixes**
+  - Fix pointer/mouse events not being dispatched to JavaScript in the same
+    order that they are generated by Starboard, relative to other input events
+    like key presses.
+  - Fix issue with CSS media queries not assigning correct rule indices.
+    An issue was discovered and fixed where CSS rules defined within `@media`
+    rules would be assigned a CSS rule index relative to their position within
+    the nested `@media` rule rather than being assigned an index relative to
+    their position within the parent CSS file.  As a result, rules may have been
+    assigned incorrect precedence during CSS rule matching.
+  - Fix issue where the style attribute would not appear in the string output
+    of calls to element.outerHTML.
 
 ## Version 16
  - **Rebase libwebp to version 1.0.0**
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 1214ea3..e0eb6b0 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -527,9 +527,12 @@
   }
   options.storage_manager_options.savegame_options.id = partition_key;
 
+
   base::optional<std::string> default_key =
       base::GetApplicationKey(GURL(kDefaultURL));
-  if (partition_key == default_key) {
+  if (command_line->HasSwitch(
+          browser::switches::kForceMigrationForStoragePartitioning) ||
+      partition_key == default_key) {
     options.storage_manager_options.savegame_options.fallback_to_default_id =
         true;
   }
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 6c34f09..076d136 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -192,6 +192,14 @@
     "video on platforms that do not support stereoscopy natively, letting the "
     "client apply a stereo mesh projection (one that differs for each eye).";
 
+const char kForceMigrationForStoragePartitioning[] =
+    "force_migration_for_storage_partitioning";
+const char kForceMigrationForStoragePartitioningHelp[] =
+    "Overrides the default storage migration policy when upgrading to "
+    "partitioned storage and forces data migration regardless of the"
+    "initial app url. The default policy is to migrate data only for"
+    "https://www.youtube.com/tv.";
+
 // If toggled, framerate statistics will be printed to stdout after each
 // animation completes, or after a maximum number of frames has been collected.
 const char kFPSPrint[] = "fps_stdout";
@@ -366,6 +374,8 @@
 
         {kDisableJavaScriptJit, kDisableJavaScriptJitHelp},
         {kEnableMapToMeshRectanglar, kEnableMapToMeshRectanglarHelp},
+        {kForceMigrationForStoragePartitioning,
+         kForceMigrationForStoragePartitioningHelp},
         {kFPSPrint, kFPSPrintHelp}, {kFPSOverlay, kFPSOverlayHelp},
         {kHelp, kHelpHelp},
         {kImageCacheSizeInBytes, kImageCacheSizeInBytesHelp},
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 59a45df..9c9e4fc 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -91,6 +91,7 @@
 extern const char kDisableJavaScriptJit[];
 extern const char kDisableJavaScriptJitHelp[];
 extern const char kEnableMapToMeshRectanglar[];
+extern const char kForceMigrationForStoragePartitioning[];
 extern const char kFPSPrint[];
 extern const char kFPSPrintHelp[];
 extern const char kFPSOverlay[];
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 015294b..8972928 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-183273
\ No newline at end of file
+185964
\ No newline at end of file
diff --git a/src/cobalt/css_parser/css_parser.gyp b/src/cobalt/css_parser/css_parser.gyp
index 1bc9100..f9bc38b 100644
--- a/src/cobalt/css_parser/css_parser.gyp
+++ b/src/cobalt/css_parser/css_parser.gyp
@@ -20,11 +20,8 @@
     'conditions': [
       ['host_os=="win"', {
         'bison_exe': '<(DEPTH)/third_party/winflexbison/bin/Release/win_bison',
-        'bison_major_version': '3'
       }, {
         'bison_exe': 'bison',
-        'bison_major_version': '<!(bison --version | '
-          'head -n 1 | sed -Ee "s/[^0-9]*([0-9]+).*/\\1/")'
       }],
     ],
   },
@@ -38,13 +35,7 @@
       'type': 'none',
       'sources': [
         'grammar.h',
-      ],
-      'conditions': [
-        ['bison_major_version==2', {
-          'sources': ['grammar-bison-2.y'],
-        }, {
-          'sources': ['grammar.y']
-        }]
+	'grammar.y'
       ],
       # Generated header files are stored in the intermediate directory
       # under their module sub-directory.
@@ -111,9 +102,6 @@
         'trivial_string_piece.h',
         'trivial_type_pairs.h',
       ],
-      'defines': [
-        'BISON_VERSION_MAJOR=<@(bison_major_version)'
-      ],
       # Scanner exposes UChar32 in a header.
       'direct_dependent_settings': {
         'include_dirs': [
@@ -138,9 +126,6 @@
         'scanner_test.cc',
         'trivial_string_piece_test.cc',
       ],
-      'defines': [
-        'BISON_VERSION_MAJOR=<@(bison_major_version)'
-      ],
       'dependencies': [
         '<(DEPTH)/cobalt/base/base.gyp:base',
         '<(DEPTH)/cobalt/test/test.gyp:run_all_unittests',
diff --git a/src/cobalt/css_parser/grammar-bison-2.y b/src/cobalt/css_parser/grammar-bison-2.y
deleted file mode 100644
index c620f85..0000000
--- a/src/cobalt/css_parser/grammar-bison-2.y
+++ /dev/null
@@ -1,6901 +0,0 @@
-// Copyright 2014 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file contains a definition of CSS grammar.
-
-// A reentrant parser.
-%pure_parser
-
-// yyparse()'s first and only parameter.
-%parse-param { ParserImpl* parser_impl }
-
-%{
-// Specify how the location of an action should be calculated in terms
-// of its children.
-#define YYLLOC_DEFAULT(Current, Rhs, N)          \
-  if (N) {                                       \
-    Current.first_line   = Rhs[1].first_line;    \
-    Current.first_column = Rhs[1].first_column;  \
-    Current.line_start   = Rhs[1].line_start;    \
-  } else {                                       \
-    Current.first_line   = Rhs[0].first_line;    \
-    Current.first_column = Rhs[0].first_column;  \
-    Current.line_start   = Rhs[0].line_start;    \
-  }
-
-// yylex()'s third parameter.
-#define YYLEX_PARAM &(parser_impl->scanner())
-%}
-
-// Token values returned by a scanner.
-%union TokenValue {
-  float real;
-  int integer;
-  TrivialIntPair integer_pair;
-  TrivialStringPiece string;
-}
-
-//
-// Tokens returned by a scanner.
-//
-
-// Entry point tokens, injected by the parser in order to choose the path
-// within a grammar, never appear in the source code.
-%token kMediaListEntryPointToken
-%token kMediaQueryEntryPointToken
-%token kStyleSheetEntryPointToken
-%token kRuleEntryPointToken
-%token kStyleDeclarationListEntryPointToken
-%token kFontFaceDeclarationListEntryPointToken
-%token kPropertyValueEntryPointToken
-%token kPropertyIntoDeclarationDataEntryPointToken
-
-// Tokens without a value.
-%token kEndOfFileToken 0                // null
-%token kWhitespaceToken                 // tab, space, CR, LF
-%token kSgmlCommentDelimiterToken       // <!-- -->
-%token kCommentToken                    // /* */
-%token kImportantToken                  // !important
-
-// Property name tokens.
-// WARNING: Every time a new name token is introduced, it should be added
-//          to |identifier_token| rule below.
-%token kAllToken                              // all
-%token kAnimationDelayToken                   // animation-delay
-%token kAnimationDirectionToken               // animation-direction
-%token kAnimationDurationToken                // animation-duration
-%token kAnimationFillModeToken                // animation-fill-mode
-%token kAnimationIterationCountToken          // animation-iteration-count
-%token kAnimationNameToken                    // animation-name
-%token kAnimationTimingFunctionToken          // animation-timing-function
-%token kAnimationToken                        // animation
-%token kBackgroundColorToken                  // background-color
-%token kBackgroundImageToken                  // background-image
-%token kBackgroundPositionToken               // background-position
-%token kBackgroundRepeatToken                 // background-repeat
-%token kBackgroundSizeToken                   // background-size
-%token kBackgroundToken                       // background
-%token kBorderToken                           // border
-%token kBorderBottomLeftRadiusToken           // border-bottom-left-radius
-%token kBorderBottomRightRadiusToken          // border-bottom-right-radius
-%token kBorderBottomToken                     // border-bottom
-%token kBorderBottomColorToken                // border-bottom-color
-%token kBorderBottomStyleToken                // border-bottom-style
-%token kBorderBottomWidthToken                // border-bottom-width
-%token kBorderColorToken                      // border-color
-%token kBorderLeftToken                       // border-left
-%token kBorderLeftColorToken                  // border-left-color
-%token kBorderLeftStyleToken                  // border-left-style
-%token kBorderLeftWidthToken                  // border-left-width
-%token kBorderRadiusToken                     // border-radius
-%token kBorderRightToken                      // border-right
-%token kBorderRightColorToken                 // border-right-color
-%token kBorderRightStyleToken                 // border-right-style
-%token kBorderRightWidthToken                 // border-right-width
-%token kBorderStyleToken                      // border-style
-%token kBorderTopToken                        // border-top
-%token kBorderTopColorToken                   // border-top-color
-%token kBorderTopLeftRadiusToken              // border-top-left-radius
-%token kBorderTopRightRadiusToken             // border-top-right-radius
-%token kBorderTopStyleToken                   // border-top-style
-%token kBorderTopWidthToken                   // border-top-width
-%token kBorderWidthToken                      // border-width
-%token kBottomToken                           // bottom
-%token kBoxShadowToken                        // box-shadow
-%token kColorToken                            // color
-%token kContentToken                          // content
-%token kDisplayToken                          // display
-%token kFilterToken                           // filter
-%token kFontToken                             // font
-%token kFontFamilyToken                       // font-family
-%token kFontSizeToken                         // font-size
-%token kFontStyleToken                        // font-style
-%token kFontWeightToken                       // font-weight
-%token kHeightToken                           // height
-%token kLeftToken                             // left
-%token kLineHeightToken                       // line-height
-%token kMarginBottomToken                     // margin-bottom
-%token kMarginLeftToken                       // margin-left
-%token kMarginRightToken                      // margin-right
-%token kMarginToken                           // margin
-%token kMarginTopToken                        // margin-top
-%token kMaxHeightToken                        // max-height
-%token kMaxWidthToken                         // max-width
-%token kMinHeightToken                        // min-height
-%token kMinWidthToken                         // min-width
-%token kOpacityToken                          // opacity
-%token kOutlineToken                          // outline
-%token kOutlineColorToken                     // outline-color
-%token kOutlineStyleToken                     // outline-style
-%token kOutlineWidthToken                     // outline-width
-%token kOverflowToken                         // overflow
-%token kOverflowWrapToken                     // overflow-wrap
-%token kPaddingBottomToken                    // padding-bottom
-%token kPaddingLeftToken                      // padding-left
-%token kPaddingRightToken                     // padding-right
-%token kPaddingToken                          // padding
-%token kPaddingTopToken                       // padding-top
-%token kPointerEventsToken                    // pointer-events
-%token kPositionToken                         // position
-%token kRightToken                            // right
-%token kSrcToken                              // src
-%token kTextAlignToken                        // text-align
-%token kTextDecorationToken                   // text-decoration
-%token kTextDecorationColorToken              // text-decoration-color
-%token kTextDecorationLineToken               // text-decoration-line
-%token kTextIndentToken                       // text-indent
-%token kTextOverflowToken                     // text-overflow
-%token kTextShadowToken                       // text-shadow
-%token kTextTransformToken                    // text-transform
-%token kTopToken                              // top
-%token kTransformToken                        // transform
-%token kTransformOriginToken                  // transform-origin
-%token kTransitionDelayToken                  // transition-delay
-%token kTransitionDurationToken               // transition-duration
-%token kTransitionPropertyToken               // transition-property
-%token kTransitionTimingFunctionToken         // transition-timing-function
-%token kTransitionToken                       // transition
-%token kUnicodeRangePropertyToken             // unicode-range
-%token kVerticalAlignToken                    // vertical-align
-%token kVisibilityToken                       // visibility
-%token kWhiteSpacePropertyToken               // white-space
-%token kWidthToken                            // width
-%token kZIndexToken                           // z-index
-
-// Property value tokens.
-// WARNING: Every time a new name token is introduced, it should be added
-//          to |identifier_token| rule below.
-%token kAbsoluteToken                   // absolute
-%token kAlternateToken                  // alternate
-%token kAlternateReverseToken           // alternate-reverse
-%token kAquaToken                       // aqua
-%token kAtToken                         // at
-%token kAutoToken                       // auto
-%token kBackwardsToken                  // backwards
-%token kBaselineToken                   // baseline
-%token kBlackToken                      // black
-%token kBlockToken                      // block
-%token kBlueToken                       // blue
-%token kBoldToken                       // bold
-%token kBothToken                       // both
-%token kBreakWordToken                  // break-word
-%token kCenterToken                     // center
-%token kCircleToken                     // circle
-%token kClipToken                       // clip
-%token kClosestCornerToken              // closest-corner
-%token kClosestSideToken                // closest-side
-%token kContainToken                    // contain
-%token kCoverToken                      // cover
-%token kCursiveToken                    // cursive
-%token kEaseInOutToken                  // ease-in-out
-%token kEaseInToken                     // ease-in
-%token kEaseOutToken                    // ease-out
-%token kEaseToken                       // ease
-%token kEllipseToken                    // ellipse
-%token kEllipsisToken                   // ellipsis
-%token kEndToken                        // end
-%token kEquirectangularToken            // equirectangular
-%token kFantasyToken                    // fantasy
-%token kFarthestCornerToken             // farthest-corner
-%token kFarthestSideToken               // farthest-side
-%token kFixedToken                      // fixed
-%token kForwardsToken                   // forwards
-%token kFromToken                       // from
-%token kFuchsiaToken                    // fuchsia
-%token kGrayToken                       // gray
-%token kGreenToken                      // green
-%token kHiddenToken                     // hidden
-%token kInfiniteToken                   // infinite
-%token kInheritToken                    // inherit
-%token kInitialToken                    // initial
-%token kInlineBlockToken                // inline-block
-%token kInlineToken                     // inline
-%token kInsetToken                      // inset
-%token kItalicToken                     // italic
-%token kLimeToken                       // lime
-%token kLinearToken                     // linear
-%token kLineThroughToken                // line-through
-// %token kLeftToken                    // left - also property name token
-%token kMaroonToken                     // maroon
-%token kMiddleToken                     // middle
-%token kMonoscopicToken                 // monoscopic
-%token kMonospaceToken                  // monospace
-%token kNavyToken                       // navy
-%token kNoneToken                       // none
-%token kNoRepeatToken                   // no-repeat
-%token kNormalToken                     // normal
-%token kNoWrapToken                     // nowrap
-%token kObliqueToken                    // oblique
-%token kOliveToken                      // olive
-%token kPreToken                        // pre
-%token kPreLineToken                    // pre-line
-%token kPreWrapToken                    // pre-wrap
-%token kPurpleToken                     // purple
-%token kRectangularToken                // rectangular
-%token kRedToken                        // red
-%token kRepeatToken                     // repeat
-%token kRepeatXToken                    // repeat-x
-%token kRepeatYToken                    // repeat-y
-%token kRelativeToken                   // relative
-%token kReverseToken                    // reverse
-// %token kRightToken                   // right - also property name token
-%token kSansSerifToken                  // sans-serif
-%token kSerifToken                      // serif
-%token kSilverToken                     // silver
-%token kSolidToken                      // solid
-%token kStartToken                      // start
-%token kStaticToken                     // static
-%token kStepEndToken                    // step-end
-%token kStepStartToken                  // step-start
-%token kStereoscopicLeftRightToken      // stereoscopic-left-right
-%token kStereoscopicTopBottomToken      // stereoscopic-top-bottom
-%token kTealToken                       // teal
-%token kToToken                         // to
-// %token kTopToken                     // top - also property name token
-%token kTransparentToken                // transparent
-%token kUppercaseToken                  // uppercase
-%token kVisibleToken                    // visible
-%token kWhiteToken                      // white
-%token kYellowToken                     // yellow
-
-// Pseudo-class name tokens.
-// WARNING: Every time a new name token is introduced, it should be added
-//          to |identifier_token| rule below.
-%token kActiveToken                     // active
-%token kEmptyToken                      // empty
-%token kFocusToken                      // focus
-%token kHoverToken                      // hover
-
-// Pseudo-element name tokens.
-// WARNING: Every time a new name token is introduced, it should be added
-//          to |identifier_token| rule below.
-%token kAfterToken                      // after
-%token kBeforeToken                     // before
-
-// Attribute matching tokens.
-%token kIncludesToken                   // ~=
-%token kDashMatchToken                  // |=
-%token kBeginsWithToken                 // ^=
-%token kEndsWithToken                   // $=
-%token kContainsToken                   // *=
-
-// "Media query" mode: Operator tokens.
-%token kMediaAndToken                   // and
-%token kMediaNotToken                   // not
-%token kMediaOnlyToken                  // only
-%token kMediaMinimumToken               // min-
-%token kMediaMaximumToken               // max-
-
-// "Media query" mode: Media type tokens.
-// WARNING: Every time a new media type token is introduced, it should be added
-//          to |media_type_known| rule below.
-%token kAllMediaTypeToken              // all
-%token kTVMediaTypeToken               // tv
-%token kScreenMediaTypeToken           // screen
-
-// "Media query" mode: Media feature type tokens. These tokens represent the
-// value types of media features. The integer values of these tokens represent
-// enum MediaFeatureName.
-// WARNING: Every time a new media feature type token is introduced, it should
-//          be added to |media_type_unknown| rule below.
-
-%token <integer> kLengthMediaFeatureTypeToken             // ...px, ...em, etc.
-%token <integer> kOrientationMediaFeatureTypeToken        // portrait, landscape
-%token <integer> kRatioMediaFeatureTypeToken              // ... / ...
-%token <integer> kNonNegativeIntegerMediaFeatureTypeToken // 0, 1, 2, 3, ...
-%token <integer> kResolutionMediaFeatureTypeToken         // ...dpi, ...dpcm
-%token <integer> kScanMediaFeatureTypeToken               // progressive,
-                                                          // interlace
-%token <integer> kZeroOrOneMediaFeatureTypeToken          // 0, 1
-
-// "Media query" mode: Media feature value tokens.
-%token kInterlaceMediaFeatureKeywordValueToken   // interlace
-%token kLandscapeMediaFeatureKeywordValueToken   // landscape
-%token kPortraitMediaFeatureKeywordValueToken    // portrait
-%token kProgressiveMediaFeatureKeywordValueToken // progressive
-
-// "Supports" mode tokens.
-%token kSupportsAndToken                // and (in "supports" mode)
-%token kSupportsNotToken                // not (in "supports" mode)
-%token kSupportsOrToken                 // or (in "supports" mode)
-
-// @-tokens.
-%token kImportToken                     // @import
-%token kKeyframesToken                  // @keyframes
-%token kPageToken                       // @page
-%token kMediaToken                      // @media
-%token kFontFaceToken                   // @font-face
-%token kCharsetToken                    // @charset
-%token kNamespaceToken                  // @namespace
-%token kSupportsToken                   // @supports
-
-// Paged media tokens.
-%token kTopLeftCornerToken              // @top-left-corner
-%token kTopLeftToken                    // @top-left
-%token kTopCenterToken                  // @top-center
-%token kTopRightToken                   // @top-right
-%token kTopRightCornerToken             // @top-right-corner
-%token kBottomLeftCornerToken           // @bottom-left-corner
-%token kBottomLeftToken                 // @bottom-left
-%token kBottomCenterToken               // @bottom-center
-%token kBottomRightToken                // @bottom-right
-%token kBottomRightCornerToken          // @bottom-right-corner
-%token kLeftTopToken                    // @left-top
-%token kLeftMiddleToken                 // @left-middle
-%token kLeftBottomToken                 // @left-bottom
-%token kRightTopToken                   // @right-top
-%token kRightMiddleToken                // @right-middle
-%token kRightBottomToken                // @right-bottom
-
-// Function tokens.
-%token kCalcFunctionToken               // calc(
-%token kCubicBezierFunctionToken        // cubic-bezier(
-%token kCueFunctionToken                // cue(
-%token kFormatFunctionToken             // format(
-%token kLinearGradientFunctionToken     // linear-gradient(
-%token kLocalFunctionToken              // local(
-%token kMapToMeshFunctionToken          // map-to-mesh(
-%token kMatrixFunctionToken             // matrix(
-%token kMatrix3dFunctionToken           // matrix3d(
-%token kNotFunctionToken                // not(
-%token kNthChildFunctionToken           // nth-child(
-%token kNthLastChildFunctionToken       // nth-last-child(
-%token kNthLastOfTypeFunctionToken      // nth-last-of-type(
-%token kNthOfTypeFunctionToken          // nth-of-type(
-%token kRotateFunctionToken             // rotate(
-%token kScaleFunctionToken              // scale(
-%token kScaleXFunctionToken             // scaleX(
-%token kScaleYFunctionToken             // scaleY(
-%token kStepsFunctionToken              // steps(
-%token kTranslateFunctionToken          // translate(
-%token kTranslateXFunctionToken         // translateX(
-%token kTranslateYFunctionToken         // translateY(
-%token kTranslateZFunctionToken         // translateZ(
-%token kRadialGradientFunctionToken     // radial-gradient(
-%token kRGBFunctionToken                // rgb(
-%token kRGBAFunctionToken               // rgba(
-%token kCobaltMtmFunctionToken          // -cobalt-mtm(
-
-// Tokens with a string value.
-%token <string> kStringToken            // "...", '...'
-%token <string> kIdentifierToken        // ...
-%token <string> kNthToken               // an+b, where a, b - integers
-%token <string> kHexToken               // #...
-%token <string> kIdSelectorToken        // #...
-%token <string> kUriToken               // url(...
-%token <string> kInvalidFunctionToken   // ...(
-%token <string> kInvalidNumberToken     // ... (digits)
-%token <string> kInvalidDimensionToken  // XXyy, where XX - number,
-                                        //             yy - identifier
-%token <string> kInvalidAtBlockToken    // @... { ... }, @... ... ;
-%token <string> kOtherBrowserAtBlockToken    // @-... { ... }
-
-// Tokens with an integer value.
-// WARNING: Use |integer| rule if you want to handle the sign.
-%token <integer> kIntegerToken          // 123, for example
-
-// Tokens with a floating point value.
-// WARNING: Remember to use |maybe_sign_token| rule with these tokens.
-%token <real> kRealToken                                    // 1.23, for example
-%token <real> kPercentageToken                              // ...%
-%token <real> kRootElementFontSizesAkaRemToken              // ...rem
-%token <real> kZeroGlyphWidthsAkaChToken                    // ...ch
-%token <real> kFontSizesAkaEmToken                          // ...em
-%token <real> kXHeightsAkaExToken                           // ...ex
-%token <real> kPixelsToken                                  // ...px
-%token <real> kCentimetersToken                             // ...cm
-%token <real> kMillimetersToken                             // ...mm
-%token <real> kInchesToken                                  // ...in
-%token <real> kPointsToken                                  // ...pt
-%token <real> kPicasToken                                   // ...pc
-%token <real> kDegreesToken                                 // ...deg
-%token <real> kRadiansToken                                 // ...rad
-%token <real> kGradiansToken                                // ...grad
-%token <real> kTurnsToken                                   // ...turn
-%token <real> kMillisecondsToken                            // ...ms
-%token <real> kSecondsToken                                 // ...s
-%token <real> kHertzToken                                   // ...hz
-%token <real> kKilohertzToken                               // ...khz
-%token <real> kViewportWidthPercentsAkaVwToken              // ...vw
-%token <real> kViewportHeightPercentsAkaVhToken             // ...vh
-%token <real> kViewportSmallerSizePercentsAkaVminToken      // ...vmin
-%token <real> kViewportLargerSizePercentsAkaVmaxToken       // ...vmax
-%token <real> kDotsPerPixelToken                            // ...dppx
-%token <real> kDotsPerInchToken                             // ...dpi
-%token <real> kDotsPerCentimeterToken                       // ...dpcm
-%token <real> kFractionsToken                               // ...fr
-
-// Tokens with an integer pair value
-%token <integer_pair> kUnicodeRangeToken                    // u+..., U+...
-
-//
-// Rules and their types, sorted by type name.
-//
-
-// A top-level rule.
-%start entry_point
-
-%union { bool important; }
-%type <important> maybe_important
-
-%type <integer> integer non_negative_integer positive_integer zero_or_one
-
-%union { cssom::RGBAColorValue* color; }
-%type <color> color
-%destructor { SafeRelease($$); } <color>
-
-%union { cssom::ColorStop* color_stop; }
-%type <color_stop> color_stop
-%destructor { delete $$; } <color_stop>
-
-%union { cssom::ColorStopList* color_stop_list; }
-%type <color_stop_list> comma_separated_color_stop_list
-%destructor { delete $$; } <color_stop_list>
-
-%union { cssom::PercentageValue* percentage; }
-%type <percentage> percentage positive_percentage
-%destructor { SafeRelease($$); } <percentage>
-
-%union { cssom::LengthValue* length; }
-%type <length> length positive_length absolute_or_relative_length
-%destructor { SafeRelease($$); } <length>
-
-%union { cssom::RatioValue* ratio; }
-%type <ratio> ratio
-%destructor { SafeRelease($$); } <ratio>
-
-%union { cssom::ResolutionValue* resolution; }
-%type <resolution> resolution
-%destructor { SafeRelease($$); } <resolution>
-
-%union { cssom::StringValue* string_value; }
-%type <string_value> font_family_name_identifier_list
-                     font_family_string_name
-                     font_family_specific_name
-                     font_family_specific_name_no_single_identifier
-%destructor { SafeRelease($$); } <string_value>
-
-// base::TimeDelta's internal value.  One can construct a base::TimeDelta from
-// this value using the function base::TimeDelta::FromInternalValue().  We use
-// it instead of base::TimeDelta because base::TimeDelta does not have a
-// trivial constructor and thus cannot be used in a union.
-%union { int64 time; }
-%type <time> time time_with_units_required
-
-%union { PropertyDeclaration* property_declaration; }
-%type <property_declaration> maybe_declaration
-%destructor { delete $$; } <property_declaration>
-
-// To reduce the number of classes derived from cssom::PropertyValue, some
-// semantic actions contain a value processing (such as opacity clamping
-// or RGBA color resolution) that technically belongs to computed value
-// resolution and as such should be done by layout engine. This is harmless
-// as long as web app does not rely on literal preservation of property values
-// exposed by cssom::CSSRuleStyleDeclaration (semantics is
-// always preserved).
-%union { cssom::PropertyValue* property_value; }
-%type <property_value> animation_delay_property_value
-                       animation_direction_list_element
-                       animation_direction_property_value
-                       animation_duration_property_value
-                       animation_fill_mode_list_element
-                       animation_fill_mode_property_value
-                       animation_iteration_count_list_element
-                       animation_iteration_count_property_value
-                       animation_name_list_element
-                       animation_name_property_value
-                       animation_timing_function_property_value
-                       auto
-                       background_color_property_value
-                       background_image_property_list_element
-                       background_image_property_value
-                       background_position_property_value
-                       background_repeat_element
-                       background_repeat_property_value
-                       background_repeat_property_value_without_common_values
-                       background_size_property_list_element
-                       background_size_property_value
-                       background_size_property_value_without_common_values
-                       border_color_property_value
-                       border_radius_element
-                       border_radius_element_with_common_values
-                       border_radius_property_value
-                       border_style_property_value
-                       border_width_element
-                       border_width_element_with_common_values
-                       border_width_property_value
-                       box_shadow_property_value
-                       color_property_value
-                       common_values
-                       common_values_without_errors
-                       content_property_value
-                       display_property_value
-                       font_face_local_src
-                       font_face_src_list_element
-                       font_face_src_property_value
-                       font_face_url_src
-                       font_family_name
-                       font_family_property_value
-                       font_size_property_value
-                       font_style_exclusive_property_value
-                       font_style_property_value
-                       font_weight_exclusive_property_value
-                       font_weight_property_value
-                       height_property_value
-                       length_percent_property_value
-                       line_height_property_value
-                       line_style
-                       line_style_with_common_values
-                       linear_gradient_params
-                       margin_side_property_value
-                       margin_width
-                       max_height_property_value
-                       max_width_property_value
-                       min_height_property_value
-                       min_width_property_value
-                       maybe_background_size_property_value
-                       offset_property_value
-                       opacity_property_value
-                       orientation_media_feature_keyword_value
-                       overflow_property_value
-                       overflow_wrap_property_value
-                       padding_side_property_value
-                       pointer_events_property_value
-                       position_list_element
-                       position_property_value
-                       positive_length_percent_property_value
-                       radial_gradient_params
-                       scan_media_feature_keyword_value
-                       text_align_property_value
-                       text_decoration_line_property_value
-                       text_decoration_property_value
-                       text_indent_property_value
-                       text_overflow_property_value
-                       text_shadow_property_value
-                       text_transform_property_value
-                       time_list_property_value
-                       timing_function_list_property_value
-                       transform_property_value
-                       transform_origin_property_value
-                       transition_delay_property_value
-                       transition_duration_property_value
-                       transition_property_property_value
-                       transition_timing_function_property_value
-                       unicode_range_property_value
-                       url
-                       validated_box_shadow_list
-                       validated_text_shadow_list
-                       vertical_align_property_value
-                       visibility_property_value
-                       white_space_property_value
-                       width_property_value
-                       z_index_property_value
-                       filter_property_value
-%destructor { SafeRelease($$); } <property_value>
-
-%union { std::vector<float>* number_matrix; }
-%type <number_matrix> number_matrix
-%destructor { delete $$; } <number_matrix>
-
-%union { glm::mat4* matrix4x4; }
-%type <matrix4x4> cobalt_mtm_transform_function
-%destructor { delete $$; } <matrix4x4>
-
-%union { MarginOrPaddingShorthand* margin_or_padding_shorthand; }
-%type <margin_or_padding_shorthand> margin_property_value padding_property_value
-%destructor { delete $$; } <margin_or_padding_shorthand>
-
-%union { SingleAnimationShorthand* single_animation; }
-%type <single_animation> single_animation single_non_empty_animation
-%destructor { delete $$; } <single_animation>
-
-%union { AnimationShorthandBuilder* animation_builder; }
-%type <animation_builder> comma_separated_animation_list
-%destructor { delete $$; } <animation_builder>
-
-%union { AnimationShorthand* animation; }
-%type <animation> animation_property_value
-%destructor { delete $$; } <animation>
-
-%union { FontShorthand* font; }
-%type <font> font_property_value
-             optional_font_value_list
-             non_empty_optional_font_value_list
-%destructor { delete $$; } <font>
-
-%union { TransitionShorthand* transition; }
-%type <transition> transition_property_value
-%destructor { delete $$; } <transition>
-
-%type <real> alpha angle non_negative_number number
-
-%union { cssom::CSSStyleSheet* style_sheet; }
-%type <style_sheet> style_sheet
-%destructor { SafeRelease($$); } <style_sheet>
-
-%union { cssom::CSSRuleList* rule_list; }
-%type <rule_list> rule_list rule_list_block
-%destructor { SafeRelease($$); } <rule_list>
-
-%union { cssom::AttributeSelector::ValueMatchType attribute_match; }
-%type <attribute_match> attribute_match
-
-%union { cssom::SimpleSelector* simple_selector; }
-%type <simple_selector> attribute_selector_token
-                        class_selector_token
-                        id_selector_token
-                        pseudo_class_token
-                        pseudo_element_token
-                        simple_selector_token
-                        type_selector_token
-                        universal_selector_token
-%destructor { delete $$; } <simple_selector>
-
-%union { cssom::CompoundSelector* compound_selector; }
-%type <compound_selector> compound_selector_token
-%destructor { delete $$; } <compound_selector>
-
-%union { cssom::Combinator* combinator; }
-%type <combinator> combinator
-%destructor { delete $$; } <combinator>
-
-%union { cssom::ComplexSelector* complex_selector; }
-%type <complex_selector> complex_selector
-%destructor { delete $$; } <complex_selector>
-
-%union { cssom::Selectors* selectors; }
-%type <selectors> selector_list
-%destructor { delete $$; } <selectors>
-
-%union { cssom::LinearGradientValue::SideOrCorner side_or_corner; }
-%type <side_or_corner> side side_or_corner
-
-%union { int sign; }
-%type <sign> maybe_sign_token
-
-%type <string> identifier_token
-
-%union { cssom::PropertyKey property_key; }
-%type <property_key> animatable_property_token
-
-%union { cssom::CSSDeclaredStyleData* style_declaration_data; }
-%type <style_declaration_data> style_declaration_list
-%destructor { SafeRelease($$); } <style_declaration_data>
-
-%union { cssom::CSSRuleStyleDeclaration* style_declaration; }
-%type <style_declaration> style_declaration_block
-%destructor { SafeRelease($$); } <style_declaration>
-
-%union { cssom::CSSFontFaceRule* font_face_rule; }
-%type <font_face_rule> at_font_face_rule
-%destructor { SafeRelease($$); } <font_face_rule>
-
-%union { cssom::CSSKeyframeRule* keyframe_rule; }
-%type <keyframe_rule> keyframe_rule
-%destructor { SafeRelease($$); } <keyframe_rule>
-
-%union { cssom::CSSKeyframesRule* keyframes_rule; }
-%type <keyframes_rule> at_keyframes_rule
-%destructor { SafeRelease($$); } <keyframes_rule>
-
-%union { cssom::CSSRuleList* keyframe_rule_list; }
-%type <keyframe_rule_list> keyframe_rule_list
-%destructor { SafeRelease($$); } <keyframe_rule_list>
-
-%union { float keyframe_offset; }
-%type <keyframe_offset> keyframe_offset
-
-%union { std::vector<float>* keyframe_selector; }
-%type <keyframe_selector> keyframe_selector;
-%destructor { delete $$; } <keyframe_selector>
-
-%union { cssom::CSSFontFaceDeclarationData* font_face_declaration_data; }
-%type <font_face_declaration_data> font_face_declaration_list
-%destructor { SafeRelease($$); } <font_face_declaration_data>
-
-%union { cssom::CSSMediaRule* media_rule; }
-%type <media_rule> at_media_rule
-%destructor { SafeRelease($$); } <media_rule>
-
-%union { cssom::MediaList* media_list; }
-%type <media_list> media_list
-%destructor { SafeRelease($$); } <media_list>
-
-%union { cssom::MediaQuery* media_query; }
-%type <media_query> media_query
-%destructor { SafeRelease($$); } <media_query>
-
-%union { bool evaluated_media_type; }
-%type <evaluated_media_type> evaluated_media_type media_type_specified
-
-%union { cssom::MediaFeatures* media_features; }
-%type <media_features> media_feature_list
-%destructor { delete $$; } <media_features>
-
-%union { cssom::MediaFeature* media_feature; }
-%type <media_feature> media_feature media_feature_block
-                      media_feature_with_value media_feature_without_value
-                      media_feature_allowing_operator_with_value
-
-%destructor { SafeRelease($$); } <media_feature>
-
-%union { cssom::MediaFeatureOperator media_feature_operator; }
-%type <media_feature_operator> media_feature_operator
-
-%union { cssom::CSSStyleRule* style_rule; }
-%type <style_rule> qualified_rule style_rule
-%destructor { SafeRelease($$); } <style_rule>
-
-%union { cssom::CSSRule* css_rule; }
-%type <css_rule> rule
-%destructor { SafeRelease($$); } <css_rule>
-
-%union { cssom::PropertyListValue::Builder* property_list; }
-%type <property_list> background_size_property_list
-                      border_color_property_list
-                      border_radius_property_list
-                      border_style_property_list
-                      border_width_property_list
-                      comma_separated_animation_direction_list
-                      comma_separated_animation_fill_mode_list
-                      comma_separated_animation_iteration_count_list
-                      comma_separated_animation_name_list
-                      comma_separated_background_image_list
-                      comma_separated_box_shadow_list
-                      comma_separated_font_face_src_list
-                      comma_separated_font_family_name_list
-                      comma_separated_text_shadow_list
-                      comma_separated_unicode_range_list
-                      validated_two_position_list_elements
-%destructor { delete $$; } <property_list>
-
-%union { cssom::PropertyListValue* property_list_value; }
-%type <property_list_value> at_position
-                            circle_with_positive_length
-                            ellipse_with_2_positive_length_percents
-                            maybe_at_position
-                            validated_position_property
-%destructor { SafeRelease($$); } <property_list_value>
-
-%union { cssom::TransformFunction* transform_function; }
-%type <transform_function> scale_function_parameters
-%destructor { delete $$; } <transform_function>
-
-%union { cssom::TransformFunctionListValue::Builder* transform_functions; }
-%type <transform_functions> transform_list
-%destructor { delete $$; } <transform_functions>
-
-%union { cssom::FilterFunction* filter_function; }
-%type <filter_function> cobalt_mtm_filter_function
-%type <filter_function> filter_function
-%destructor { delete $$; } <filter_function>
-
-%union { cssom::FilterFunctionListValue::Builder* cobalt_mtm_filter_functions; }
-%type <cobalt_mtm_filter_functions> filter_function_list
-%destructor { delete $$; } <cobalt_mtm_filter_functions>
-
-%union {
-  cssom::MapToMeshFunction::MeshSpec* cobalt_map_to_mesh_spec; }
-%type <cobalt_map_to_mesh_spec> cobalt_map_to_mesh_spec
-%destructor { delete $$; } <cobalt_map_to_mesh_spec>
-
-%union {
-  cssom::MapToMeshFunction::ResolutionMatchedMeshListBuilder* cobalt_mtm_resolution_matched_meshes; }
-%type <cobalt_mtm_resolution_matched_meshes> cobalt_mtm_resolution_matched_mesh_list
-%destructor { delete $$; } <cobalt_mtm_resolution_matched_meshes>
-
-%union { cssom::MapToMeshFunction::ResolutionMatchedMesh* cobalt_mtm_resolution_matched_mesh; }
-%type <cobalt_mtm_resolution_matched_mesh> cobalt_mtm_resolution_matched_mesh
-%destructor { delete $$; } <cobalt_mtm_resolution_matched_mesh>
-
-%union { cssom::KeywordValue* stereo_mode; }
-%type <stereo_mode> maybe_cobalt_mtm_stereo_mode;
-%type <stereo_mode> cobalt_mtm_stereo_mode;
-%destructor { SafeRelease($$); } <stereo_mode>
-
-%union { cssom::TimeListValue::Builder* time_list; }
-%type <time_list> comma_separated_time_list
-%destructor { delete $$; } <time_list>
-
-%union { cssom::PropertyKeyListValue::Builder* property_name_list; }
-%type <property_name_list> comma_separated_animatable_property_name_list
-%destructor { delete $$; } <property_name_list>
-
-%union {
-  cssom::SteppingTimingFunction::ValueChangeLocation
-      stepping_value_change_location;
-}
-%type <stepping_value_change_location> maybe_steps_start_or_end_parameter
-
-%union { cssom::TimingFunction* timing_function; }
-%type <timing_function> single_timing_function
-%destructor { SafeRelease($$); } <timing_function>
-
-%union {
-  cssom::TimingFunctionListValue::Builder*
-      timing_function_list;
-}
-%type <timing_function_list>
-    comma_separated_single_timing_function_list
-%destructor { delete $$; } <timing_function_list>
-
-%union { SingleTransitionShorthand* single_transition; }
-%type <single_transition> single_transition single_non_empty_transition
-%destructor { delete $$; } <single_transition>
-
-%union { TransitionShorthandBuilder* transition_builder; }
-%type <transition_builder> comma_separated_transition_list
-%destructor { delete $$; } <transition_builder>
-
-%union { BackgroundShorthandLayer* background_shorthand_layer; }
-%type <background_shorthand_layer>
-    background_position_and_size_shorthand_property_value
-    background_repeat_shorthand_property_value
-    background_position_and_repeat_combination
-    final_background_layer_without_position_and_repeat
-    final_background_layer
-    background_property_value
-%destructor { delete $$; } <background_shorthand_layer>
-
-%union { PositionParseStructure* position_structure; }
-%type <position_structure> position_list
-%destructor { delete $$; } <position_structure>
-
-%union { BorderOrOutlineShorthand* border_or_outline_shorthand; }
-%type <border_or_outline_shorthand> border_or_outline_property_value
-                                    border_or_outline_property_list
-%destructor { delete $$; } <border_or_outline_shorthand>
-
-%union { ShadowPropertyInfo* shadow_info; }
-%type <shadow_info> box_shadow_list text_shadow_list
-%destructor { delete $$; } <shadow_info>
-
-%union { cssom::RadialGradientValue::SizeKeyword size_keyword; }
-%type <size_keyword> circle_with_size_keyword
-                     maybe_ellipse_with_size_keyword size_keyword
-
-%%
-
-// WARNING: Every rule, except the ones which end with "..._token", should
-//          consume trailing whitespace.
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Common rules used across the grammar.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-maybe_whitespace:
-    /* empty */
-  | maybe_whitespace kWhitespaceToken
-  ;
-
-errors:
-    error
-  | errors error
-  ;
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// @-rules.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// The @font-face rule consists of the @font-face at-keyword followed by a block
-// of descriptor declarations.
-//   https://www.w3.org/TR/css3-fonts/#font-face-rule
-at_font_face_rule:
-    kFontFaceToken maybe_whitespace '{' maybe_whitespace
-        font_face_declaration_list '}' maybe_whitespace {
-    scoped_refptr<cssom::CSSFontFaceRule>
-        font_face_rule(
-            new cssom::CSSFontFaceRule(MakeScopedRefPtrAndRelease($5)));
-    if (font_face_rule->IsValid()) {
-      $$ = AddRef(font_face_rule.get());
-    } else {
-      parser_impl->LogWarning(@1, "invalid font-face");
-      $$ = NULL;
-    }
-  }
-  ;
-
-// The @media rule is a conditional group rule whose condition is a media query.
-// It consists of the at-keyword '@media' followed by a (possibly empty) media
-// query list, followed by a group rule body. The condition of the rule is the
-// result of the media query.
-//   https://www.w3.org/TR/css3-conditional/#at-media
-at_media_rule:
-  // @media expr {}
-    kMediaToken maybe_whitespace media_list rule_list_block {
-    $$ = AddRef(new cssom::CSSMediaRule(MakeScopedRefPtrAndRelease($3),
-                                        MakeScopedRefPtrAndRelease($4)));
-  }
-  ;
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Media Rule, Media Query, Media Type
-//   https://www.w3.org/TR/cssom/#media-queries
-//   https://www.w3.org/TR/css3-mediaqueries/
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// Follow the syntax defined here:
-//   https://www.w3.org/TR/css3-mediaqueries/#syntax
-
-// Orientation value, landscale or portrait
-//   https://www.w3.org/TR/css3-mediaqueries/#orientation
-orientation_media_feature_keyword_value:
-    kLandscapeMediaFeatureKeywordValueToken maybe_whitespace {
-    $$ = AddRef(cssom::MediaFeatureKeywordValue::GetLandscape().get());
-  }
-  | kPortraitMediaFeatureKeywordValueToken maybe_whitespace {
-    $$ = AddRef(cssom::MediaFeatureKeywordValue::GetPortrait().get());
-  }
-  ;
-
-// Scan value, interlace or progressive
-//   https://www.w3.org/TR/css3-mediaqueries/#scan
-scan_media_feature_keyword_value:
-    kInterlaceMediaFeatureKeywordValueToken maybe_whitespace {
-    $$ = AddRef(cssom::MediaFeatureKeywordValue::GetInterlace().get());
-  }
-  | kProgressiveMediaFeatureKeywordValueToken maybe_whitespace {
-    $$ = AddRef(cssom::MediaFeatureKeywordValue::GetProgressive().get());
-  }
-  ;
-
-// 'min-' or 'max-' prefix for media feature name.
-media_feature_operator:
-    kMediaMinimumToken { $$ = cssom::kMinimum; }
-  | kMediaMaximumToken { $$ = cssom::kMaximum; }
-  ;
-
-// Media feature: 'feature' only.
-// (feature) will evaluate to true if (feature:x) will evaluate to true for a
-// value x other than zero or zero followed by a unit identifier.
-//   https://www.w3.org/TR/css3-mediaqueries/#media1
-media_feature_without_value:
-    kLengthMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kOrientationMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kRatioMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kNonNegativeIntegerMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kResolutionMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kScanMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  | kZeroOrOneMediaFeatureTypeToken maybe_whitespace {
-    $$ = AddRef(new cssom::MediaFeature($1));
-  }
-  ;
-
-// Media feature: 'feature:value' for features that don't allow prefixes.
-media_feature_with_value:
-    kOrientationMediaFeatureTypeToken maybe_whitespace colon
-    orientation_media_feature_keyword_value {
-    $$ = AddRef(new cssom::MediaFeature($1, $4));
-  }
-  | kScanMediaFeatureTypeToken maybe_whitespace colon
-    scan_media_feature_keyword_value {
-    $$ = AddRef(new cssom::MediaFeature($1, $4));
-  }
-  | kZeroOrOneMediaFeatureTypeToken maybe_whitespace colon zero_or_one {
-    $$ = AddRef(new cssom::MediaFeature($1, new cssom::IntegerValue($4)));
-  }
-  ;
-
-// Media feature: 'feature:value' for features that allow min/max prefixes.
-media_feature_allowing_operator_with_value:
-    kLengthMediaFeatureTypeToken maybe_whitespace colon length {
-    $$ = AddRef(new cssom::MediaFeature($1, MakeScopedRefPtrAndRelease($4)));
-  }
-  | kNonNegativeIntegerMediaFeatureTypeToken maybe_whitespace colon
-    non_negative_integer {
-    $$ = AddRef(new cssom::MediaFeature($1, new cssom::IntegerValue($4)));
-  }
-  | kRatioMediaFeatureTypeToken maybe_whitespace colon ratio {
-    $$ = AddRef(new cssom::MediaFeature($1, MakeScopedRefPtrAndRelease($4)));
-  }
-  | kResolutionMediaFeatureTypeToken maybe_whitespace colon resolution {
-    $$ = AddRef(new cssom::MediaFeature($1, MakeScopedRefPtrAndRelease($4)));
-  }
-  ;
-
-// Media feature: 'feature' or 'feature:value' or 'min-feature:value' or
-// 'max-feature:value'
-//   https://www.w3.org/TR/css3-mediaqueries/#media1
-media_feature:
-    media_feature_without_value
-  | media_feature_with_value
-  | media_feature_allowing_operator_with_value
-  | media_feature_operator media_feature_allowing_operator_with_value {
-    $$ = $2;
-    $$->set_operator($1);
-  }
-  ;
-
-// Media feature: '(name:value)'
-media_feature_block:
-    '(' maybe_whitespace media_feature ')' maybe_whitespace {
-    $$ = $3;
-  }
-  ;
-
-// Media feature list: '(name:value) [ and (name:value) ]'
-media_feature_list:
-  // (name:value)
-    media_feature_block {
-    $$ = new cssom::MediaFeatures();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  // ... and (name:value)
-  | media_feature_list kMediaAndToken maybe_whitespace media_feature_block {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($4));
-  }
-  ;
-
-// All tokens representing unknown media types.
-media_type_unknown:
-    kIdentifierToken
-  // "Media query" mode operator names.
-  | kMediaAndToken
-  | kMediaMinimumToken
-  | kMediaMaximumToken
-  // "Media query" mode media feature tokens
-  | kLengthMediaFeatureTypeToken
-  | kOrientationMediaFeatureTypeToken
-  | kRatioMediaFeatureTypeToken
-  | kNonNegativeIntegerMediaFeatureTypeToken
-  | kResolutionMediaFeatureTypeToken
-  | kScanMediaFeatureTypeToken
-  | kZeroOrOneMediaFeatureTypeToken
-  ;
-
-// All tokens representing media types that are true on this platform.
-media_type_known:
-    kAllMediaTypeToken
-  | kTVMediaTypeToken
-  | kScreenMediaTypeToken
-  ;
-
-// Returns true for known specified media types, otherwise false.
-media_type_specified:
-    media_type_unknown {
-    $$ = false;
-  }
-  | media_type_known {
-    $$ = true;
-  }
-  ;
-// The names chosen for CSS media types reflect target devices for which the
-// relevant properties make sense
-//   https://www.w3.org/TR/CSS21/media.html#media-types
-//   https://www.w3.org/TR/css3-mediaqueries/#media0
-evaluated_media_type:
-  // @media [type]...
-    media_type_specified {
-    $$ = $1;
-  }
-  // @media not [type]...
-  | kMediaNotToken kWhitespaceToken media_type_specified {
-    $$ = !$3;
-  }
-  // @media only [type]...
-  | kMediaOnlyToken kWhitespaceToken media_type_specified {
-    $$ = $3;
-  }
-  // @media only not ... (special case)
-  | kMediaOnlyToken kWhitespaceToken kMediaNotToken {
-    $$ = false;
-  }
-  // @media not only ... (special case)
-  | kMediaNotToken kWhitespaceToken kMediaOnlyToken {
-    $$ = true;
-  }
-  ;
-
-// A media query consists of a media type and zero or more expressions that
-// check for the conditions of particular media features.
-//   https://www.w3.org/TR/cssom/#media-queries
-//   https://www.w3.org/TR/css3-mediaqueries/#media0
-media_query:
-  // @media  {}
-    /* empty */ {
-    $$ = AddRef(new cssom::MediaQuery(true));
-  }
-  // @media (name:value)... {}
-  | media_feature_list {
-    scoped_ptr<cssom::MediaFeatures> media_features($1);
-    $$ = AddRef(new cssom::MediaQuery(true, media_features.Pass()));
-  }
-  // @media mediatype {}
-  | evaluated_media_type maybe_whitespace {
-    $$ = AddRef(new cssom::MediaQuery($1));
-  }
-  // @media mediatype and (name:value)... {}
-  | evaluated_media_type maybe_whitespace kMediaAndToken maybe_whitespace
-    media_feature_list {
-    scoped_ptr<cssom::MediaFeatures> media_features($5);
-    $$ = AddRef(new cssom::MediaQuery($1, media_features.Pass()));
-  }
-  // When an unknown media feature, an unknown media feature value, a malformed
-  // media query, or unexpected tokens is found, the media query must be
-  // represented as 'not all'.
-  //   https://www.w3.org/TR/css3-mediaqueries/#error-handling
-  | errors {
-    $$ = AddRef(new cssom::MediaQuery(true));
-  }
-  ;
-
-// Several media queries can be combined in a media query list.
-//   https://www.w3.org/TR/cssom/#medialist
-//   https://www.w3.org/TR/css3-mediaqueries/#media0
-media_list:
-    media_query {
-    $$ = AddRef(new cssom::MediaList(parser_impl->css_parser()));
-    $$->Append(MakeScopedRefPtrAndRelease($1));
-  }
-  | media_list comma media_query {
-    $$ = $1;
-    $$->Append(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Keyframe Rule and Keyframes Rule
-//   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#CSSKeyframeRule-interface
-//   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#CSSKeyframesRule-interface
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-at_keyframes_rule:
-    kKeyframesToken maybe_whitespace kIdentifierToken maybe_whitespace '{'
-    maybe_whitespace keyframe_rule_list '}' maybe_whitespace {
-    $$ = $7 ? AddRef(
-        new cssom::CSSKeyframesRule($3.ToString(),
-                                    MakeScopedRefPtrAndRelease($7))) : NULL;
-  }
-  ;
-
-keyframe_rule_list:
-    keyframe_rule {
-    $$ = AddRef(new cssom::CSSRuleList());
-    $$->AppendCSSRule(MakeScopedRefPtrAndRelease($1));
-  }
-  | error {
-    // The error message is logged by |keyframe_rule|, so it is not necessary to
-    // log it again.
-    $$ = NULL;
-  }
-  | keyframe_rule_list keyframe_rule {
-    $$ = $1;
-    scoped_refptr<cssom::CSSKeyframeRule> keyframe_rule(
-        MakeScopedRefPtrAndRelease($2));
-    if ($$) {
-      $$->AppendCSSRule(keyframe_rule);
-    }
-  }
-  ;
-
-keyframe_rule:
-    keyframe_selector style_declaration_block {
-    scoped_ptr<std::vector<float> > offsets($1);
-
-    scoped_refptr<cssom::CSSRuleStyleDeclaration> style(
-        MakeScopedRefPtrAndRelease($2));
-    const cssom::CSSDeclaredStyleData::PropertyValues& property_values = style->data()->declared_property_values();
-    for (cssom::CSSDeclaredStyleData::PropertyValues::const_iterator
-             property_iterator = property_values.begin();
-             property_iterator != property_values.end();
-             ++property_iterator) {
-      if (property_iterator->second == cssom::KeywordValue::GetInherit() ||
-          property_iterator->second == cssom::KeywordValue::GetInitial()) {
-        parser_impl->LogError(
-            @2, "keyframe properties with initial or inherit are not supported");
-        YYERROR;
-      }
-    }
-
-    $$ = AddRef(new cssom::CSSKeyframeRule(*offsets, style));
-  }
-  ;
-
-keyframe_selector:
-    keyframe_offset {
-    $$ = new std::vector<float>(1, $1);
-  }
-  | keyframe_selector ',' maybe_whitespace keyframe_offset {
-    $$ = $1;
-    $$->push_back($4);
-  }
-  ;
-
-keyframe_offset:
-    kFromToken maybe_whitespace {
-    $$ = 0.0f;
-  }
-  | kToToken maybe_whitespace {
-    $$ = 1.0f;
-  }
-  | kPercentageToken maybe_whitespace {
-    $$ = $1 / 100.0f;
-  }
-  ;
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Selectors.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// Some identifiers such as property names or values are recognized
-// specifically by the scanner. We are merging those identifiers back together
-// to allow their use in selectors.
-identifier_token:
-    kIdentifierToken
-  // Property names.
-  | kAllToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAllProperty));
-  }
-  | kAnimationDelayToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationDelayProperty));
-  }
-  | kAnimationDirectionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationDirectionProperty));
-  }
-  | kAnimationDurationToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationDurationProperty));
-  }
-  | kAnimationFillModeToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationFillModeProperty));
-  }
-  | kAnimationIterationCountToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationIterationCountProperty));
-  }
-  | kAnimationNameToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationNameProperty));
-  }
-  | kAnimationTimingFunctionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationTimingFunctionProperty));
-  }
-  | kAnimationToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kAnimationProperty));
-  }
-  | kBackgroundColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundColorProperty));
-  }
-  | kBackgroundImageToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundImageProperty));
-  }
-  | kBackgroundPositionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundPositionProperty));
-  }
-  | kBackgroundRepeatToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundRepeatProperty));
-  }
-  | kBackgroundSizeToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundSizeProperty));
-  }
-  | kBackgroundToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBackgroundProperty));
-  }
-  | kBorderToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderProperty));
-  }
-  | kBorderBottomLeftRadiusToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomLeftRadiusProperty));
-  }
-  | kBorderBottomRightRadiusToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomRightRadiusProperty));
-  }
-  | kBorderBottomToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomProperty));
-  }
-  | kBorderBottomColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomColorProperty));
-  }
-  | kBorderBottomStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomStyleProperty));
-  }
-  | kBorderBottomWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderBottomWidthProperty));
-  }
-  | kBorderLeftToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderLeftProperty));
-  }
-  | kBorderColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderColorProperty));
-  }
-  | kBorderLeftColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderLeftColorProperty));
-  }
-  | kBorderLeftStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderLeftStyleProperty));
-  }
-  | kBorderLeftWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderLeftWidthProperty));
-  }
-  | kBorderRadiusToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderRadiusProperty));
-  }
-  | kBorderRightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderRightProperty));
-  }
-  | kBorderRightColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderRightColorProperty));
-  }
-  | kBorderRightStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderRightStyleProperty));
-  }
-  | kBorderRightWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderRightWidthProperty));
-  }
-  | kBorderStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderStyleProperty));
-  }
-  | kBorderTopToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderTopProperty));
-  }
-  | kBorderTopColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderTopColorProperty));
-  }
-  | kBorderTopLeftRadiusToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderTopLeftRadiusProperty));
-  }
-  | kBorderTopRightRadiusToken {
-    $$ = TrivialStringPiece::FromCString(
-          cssom::GetPropertyName(cssom::kBorderTopRightRadiusProperty));
-  }
-  | kBorderTopStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderTopStyleProperty));
-  }
-  | kBorderTopWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderTopWidthProperty));
-  }
-  | kBorderWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBorderWidthProperty));
-  }
-  | kBottomToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBottomProperty));
-  }
-  | kBoxShadowToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kBoxShadowProperty));
-  }
-  | kColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kColorProperty));
-  }
-  | kContentToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kContentProperty));
-  }
-  | kDisplayToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kDisplayProperty));
-  }
-  | kFilterToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kFilterProperty));
-  }
-  | kFontToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kFontProperty));
-  }
-  | kFontFamilyToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kFontFamilyProperty));
-  }
-  | kFontSizeToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kFontSizeProperty));
-  }
-  | kFontWeightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kFontWeightProperty));
-  }
-  | kHeightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kHeightProperty));
-  }
-  | kLeftToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kLeftProperty));
-  }
-  | kLineHeightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kLineHeightProperty));
-  }
-  | kMarginBottomToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMarginBottomProperty));
-  }
-  | kMarginLeftToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMarginLeftProperty));
-  }
-  | kMarginRightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMarginRightProperty));
-  }
-  | kMarginToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMarginProperty));
-  }
-  | kMarginTopToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMarginTopProperty));
-  }
-  | kMaxHeightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMaxHeightProperty));
-  }
-  | kMaxWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMaxWidthProperty));
-  }
-  | kMinHeightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMinHeightProperty));
-  }
-  | kMinWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kMinWidthProperty));
-  }
-  | kOpacityToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOpacityProperty));
-  }
-  | kOutlineToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOutlineProperty));
-  }
-  | kOutlineColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOutlineColorProperty));
-  }
-  | kOutlineStyleToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOutlineStyleProperty));
-  }
-  | kOutlineWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOutlineWidthProperty));
-  }
-  | kOverflowToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOverflowProperty));
-  }
-  | kOverflowWrapToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kOverflowWrapProperty));
-  }
-  | kPaddingBottomToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPaddingBottomProperty));
-  }
-  | kPaddingLeftToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPaddingLeftProperty));
-  }
-  | kPaddingRightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPaddingRightProperty));
-  }
-  | kPaddingToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPaddingProperty));
-  }
-  | kPaddingTopToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPaddingTopProperty));
-  }
-  | kPointerEventsToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPointerEventsProperty));
-  }
-  | kPositionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kPositionProperty));
-  }
-  | kRightToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kRightProperty));
-  }
-  | kSrcToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kSrcProperty));
-  }
-  | kTextAlignToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextAlignProperty));
-  }
-  | kTextDecorationToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextDecorationProperty));
-  }
-  | kTextDecorationColorToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextDecorationColorProperty));
-  }
-  | kTextDecorationLineToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextDecorationLineProperty));
-  }
-  | kTextIndentToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextIndentProperty));
-  }
-  | kTextOverflowToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextOverflowProperty));
-  }
-  | kTextTransformToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTextTransformProperty));
-  }
-  | kTopToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTopProperty));
-  }
-  | kTransformToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransformProperty));
-  }
-  | kTransformOriginToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransformOriginProperty));
-  }
-  | kTransitionDelayToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransitionDelayProperty));
-  }
-  | kTransitionDurationToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransitionDurationProperty));
-  }
-  | kTransitionPropertyToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransitionPropertyProperty));
-  }
-  | kTransitionTimingFunctionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransitionTimingFunctionProperty));
-  }
-  | kTransitionToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kTransitionProperty));
-  }
-  | kUnicodeRangePropertyToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kUnicodeRangeProperty));
-  }
-  | kVerticalAlignToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kVerticalAlignProperty));
-  }
-  | kVisibilityToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kVisibilityProperty));
-  }
-  | kWhiteSpacePropertyToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kWhiteSpaceProperty));
-  }
-  | kWidthToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kWidthProperty));
-  }
-  | kZIndexToken {
-    $$ = TrivialStringPiece::FromCString(
-            cssom::GetPropertyName(cssom::kZIndexProperty));
-  }
-  // Property values.
-  | kAbsoluteToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAbsoluteKeywordName);
-  }
-  | kAlternateToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAlternateKeywordName);
-  }
-  | kAlternateReverseToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAlternateReverseKeywordName);
-  }
-  | kAquaToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAquaKeywordName);
-  }
-  | kAtToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAtKeywordName);
-  }
-  | kAutoToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAutoKeywordName);
-  }
-  | kBackwardsToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBackwardsKeywordName);
-  }
-  | kBaselineToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBaselineKeywordName);
-  }
-  | kBlackToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBlackKeywordName);
-  }
-  | kBlockToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBlockKeywordName);
-  }
-  | kBlueToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBlueKeywordName);
-  }
-  | kBoldToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBoldKeywordName);
-  }
-  | kBothToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBothKeywordName);
-  }
-  // A rule for kBottomToken is already defined for the matching property name.
-  | kBreakWordToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBreakWordKeywordName);
-  }
-  | kCenterToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kCenterKeywordName);
-  }
-  | kCircleToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kCircleKeywordName);
-  }
-  | kClipToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kClipKeywordName);
-  }
-  | kClosestCornerToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kClosestCornerKeywordName);
-  }
-  | kClosestSideToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kClosestSideKeywordName);
-  }
-  | kContainToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kContainKeywordName);
-  }
-  | kCoverToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kCoverKeywordName);
-  }
-  | kCursiveToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kCursiveKeywordName);
-  }
-  | kEaseInOutToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEaseInOutKeywordName);
-  }
-  | kEaseInToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEaseInKeywordName);
-  }
-  | kEaseOutToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEaseOutKeywordName);
-  }
-  | kEaseToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEaseKeywordName);
-  }
-  | kEllipseToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEllipseKeywordName);
-  }
-  | kEllipsisToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEllipsisKeywordName);
-  }
-  | kEndToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEndKeywordName);
-  }
-  | kFantasyToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFantasyKeywordName);
-  }
-  | kFarthestCornerToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFarthestCornerKeywordName);
-  }
-  | kFarthestSideToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFarthestSideKeywordName);
-  }
-  | kFixedToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFixedKeywordName);
-  }
-  | kForwardsToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kForwardsKeywordName);
-  }
-  | kFromToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFromKeywordName);
-  }
-  | kFuchsiaToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFuchsiaKeywordName);
-  }
-  | kGrayToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kGrayKeywordName);
-  }
-  | kGreenToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kGreenKeywordName);
-  }
-  | kHiddenToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kHiddenKeywordName);
-  }
-  | kInfiniteToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInfiniteKeywordName);
-  }
-  | kInheritToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInheritKeywordName);
-  }
-  | kInitialToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInitialKeywordName);
-  }
-  | kInlineBlockToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInlineBlockKeywordName);
-  }
-  | kInlineToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInlineKeywordName);
-  }
-  | kInsetToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kInsetKeywordName);
-  }
-  | kItalicToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kItalicKeywordName);
-  }
-  | kLimeToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kLimeKeywordName);
-  }
-  | kLinearToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kLinearKeywordName);
-  }
-  | kLineThroughToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kLineThroughKeywordName);
-  }
-  | kMaroonToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kMaroonKeywordName);
-  }
-  | kMiddleToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kMiddleKeywordName);
-  }
-  | kMonoscopicToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kMonoscopicKeywordName);
-  }
-  | kMonospaceToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kMonospaceKeywordName);
-  }
-  | kNavyToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kNavyKeywordName);
-  }
-  | kNoneToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kNoneKeywordName);
-  }
-  | kNoRepeatToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kNoRepeatKeywordName);
-  }
-  | kNormalToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kNormalKeywordName);
-  }
-  | kNoWrapToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kNoWrapKeywordName);
-  }
-  | kObliqueToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kObliqueKeywordName);
-  }
-  | kOliveToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kOliveKeywordName);
-  }
-  | kPreToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kPreKeywordName);
-  }
-  | kPreLineToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kPreLineKeywordName);
-  }
-  | kPreWrapToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kPreWrapKeywordName);
-  }
-  | kPurpleToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kPurpleKeywordName);
-  }
-  | kRedToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kRedKeywordName);
-  }
-  | kRepeatToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kRepeatKeywordName);
-  }
-  | kRepeatXToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kRepeatXKeywordName);
-  }
-  | kRepeatYToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kRepeatYKeywordName);
-  }
-  | kRelativeToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kRelativeKeywordName);
-  }
-  | kReverseToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kReverseKeywordName);
-  }
-  | kSansSerifToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kSansSerifKeywordName);
-  }
-  | kSerifToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kSerifKeywordName);
-  }
-  | kSilverToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kSilverKeywordName);
-  }
-  | kSolidToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kSolidKeywordName);
-  }
-  | kStartToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kStartKeywordName);
-  }
-  | kStaticToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kStaticKeywordName);
-  }
-  | kStepEndToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kStepEndKeywordName);
-  }
-  | kStepStartToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kStepStartKeywordName);
-  }
-  | kStereoscopicLeftRightToken {
-    $$ = TrivialStringPiece::FromCString(
-             cssom::kStereoscopicLeftRightKeywordName);
-  }
-  | kStereoscopicTopBottomToken {
-    $$ = TrivialStringPiece::FromCString(
-             cssom::kStereoscopicTopBottomKeywordName);
-  }
-  | kTealToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kTealKeywordName);
-  }
-  | kToToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kToKeywordName);
-  }
-  // A rule for kTopToken is already defined for the matching property name.
-  | kTransparentToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kTransparentKeywordName);
-  }
-  | kUppercaseToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kUppercaseKeywordName);
-  }
-  | kVisibleToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kVisibleKeywordName);
-  }
-  | kWhiteToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kWhiteKeywordName);
-  }
-  | kYellowToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kYellowKeywordName);
-  }
-  // Pseudo-class names.
-  | kActiveToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kActivePseudoClassName);
-  }
-  | kEmptyToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kEmptyPseudoClassName);
-  }
-  | kFocusToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kFocusPseudoClassName);
-  }
-  | kHoverToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kHoverPseudoClassName);
-  }
-  // Pseudo-element names.
-  | kAfterToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kAfterPseudoElementName);
-  }
-  | kBeforeToken {
-    $$ = TrivialStringPiece::FromCString(cssom::kBeforePseudoElementName);
-  }
-  ;
-
-// The universal selector represents an element with any name.
-//   https://www.w3.org/TR/selectors4/#universal-selector
-universal_selector_token:
-    '*' {
-    $$ = new cssom::UniversalSelector();
-  }
-  ;
-
-// A type selector represents an instance of the element type in the document
-// tree.
-//   https://www.w3.org/TR/selectors4/#type-selector
-type_selector_token:
-    identifier_token {
-    $$ = new cssom::TypeSelector($1.ToString());
-  }
-  ;
-
-attribute_match:
-    '=' maybe_whitespace {
-    $$ = cssom::AttributeSelector::kEquals;
-  }
-  | kIncludesToken maybe_whitespace {
-    $$ = cssom::AttributeSelector::kIncludes;
-  }
-  | kDashMatchToken maybe_whitespace {
-    $$ = cssom::AttributeSelector::kDashMatch;
-  }
-  | kBeginsWithToken maybe_whitespace {
-    $$ = cssom::AttributeSelector::kBeginsWith;
-  }
-  | kEndsWithToken maybe_whitespace {
-    $$ = cssom::AttributeSelector::kEndsWith;
-  }
-  | kContainsToken maybe_whitespace {
-    $$ = cssom::AttributeSelector::kContains;
-  }
-
-// An attribute selector represents an element that has an attribute that
-// matches the attribute represented by the attribute selector.
-//   https://www.w3.org/TR/selectors4/#attribute-selector
-attribute_selector_token:
-    '[' maybe_whitespace identifier_token maybe_whitespace ']' {
-    $$ = new cssom::AttributeSelector($3.ToString());
-  }
-  | '[' maybe_whitespace identifier_token maybe_whitespace
-      attribute_match kStringToken maybe_whitespace ']' {
-    $$ = new cssom::AttributeSelector($3.ToString(), $5, $6.ToString());
-  }
-  | '[' maybe_whitespace identifier_token maybe_whitespace
-      attribute_match identifier_token maybe_whitespace ']' {
-    $$ = new cssom::AttributeSelector($3.ToString(), $5, $6.ToString());
-  }
-  ;
-
-// The class selector represents an element belonging to the class identified by
-// the identifier.
-//   https://www.w3.org/TR/selectors4/#class-selector
-class_selector_token:
-    '.' identifier_token {
-    $$ = new cssom::ClassSelector($2.ToString());
-  }
-  ;
-
-// An ID selector represents an element instance that has an identifier that
-// matches the identifier in the ID selector.
-//   https://www.w3.org/TR/selectors4/#id-selector
-id_selector_token:
-    kIdSelectorToken {
-    $$ = new cssom::IdSelector($1.ToString());
-  }
-  | kHexToken {
-    if (IsAsciiDigit(*$1.begin)) {
-      YYERROR;
-    }
-    $$ = new cssom::IdSelector($1.ToString());
-  }
-  ;
-
-// The pseudo-class concept is introduced to permit selection based on
-// information that lies outside of the document tree or that can be awkward or
-// impossible to express using the other simple selectors.
-//   https://www.w3.org/TR/selectors4/#pseudo-classes
-pseudo_class_token:
-  // The :active pseudo-class applies while an element is being activated by the
-  // user. For example, between the times the user presses the mouse button and
-  // releases it. On systems with more than one mouse button, :active applies
-  // only to the primary or primary activation button (typically the "left"
-  // mouse button), and any aliases thereof.
-  //   https://www.w3.org/TR/selectors4/#active-pseudo
-    ':' kActiveToken {
-    $$ = new cssom::ActivePseudoClass();
-  }
-  // The :empty pseudo-class represents an element that has no children. In
-  // terms of the document tree, only element nodes and content nodes (such as
-  // DOM text nodes, CDATA nodes, and entity references) whose data has a
-  // non-zero length must be considered as affecting emptiness; comments,
-  // processing instructions, and other nodes must not affect whether an element
-  // is considered empty or not.
-  //   https://www.w3.org/TR/selectors4/#empty-pseudo
-  | ':' kEmptyToken {
-    $$ = new cssom::EmptyPseudoClass();
-  }
-  // The :focus pseudo-class applies while an element has the focus (accepts
-  // keyboard or mouse events, or other forms of input).
-  //   https://www.w3.org/TR/selectors4/#focus-pseudo
-  | ':' kFocusToken {
-    $$ = new cssom::FocusPseudoClass();
-  }
-  // The :hover pseudo-class applies while the user designates an element with a
-  // pointing device, but does not necessarily activate it. For example, a
-  // visual user agent could apply this pseudo-class when the cursor (mouse
-  // pointer) hovers over a box generated by the element. Interactive user
-  // agents that cannot detect hovering due to hardware limitations (e.g., a pen
-  // device that does not detect hovering) are still conforming.
-  //   https://www.w3.org/TR/selectors4/#hover-pseudo
-  | ':' kHoverToken {
-    $$ = new cssom::HoverPseudoClass();
-  }
-  // The negation pseudo-class, :not(), is a functional pseudo-class taking a
-  // selector list as an argument. It represents an element that is not
-  // represented by its argument.
-  //   https://www.w3.org/TR/selectors4/#negation-pseudo
-  | ':' kNotFunctionToken compound_selector_token ')' {
-    scoped_ptr<cssom::CompoundSelector> compound_selector($3);
-    if (compound_selector) {
-      scoped_ptr<cssom::NotPseudoClass> not_pseudo_class(new
-          cssom::NotPseudoClass());
-      not_pseudo_class->set_selector(compound_selector.Pass());
-      $$ = not_pseudo_class.release();
-    } else {
-      parser_impl->LogWarning(@1, "unsupported selector within :not()");
-      $$ = NULL;
-    }
-  }
-  | ':' kNotFunctionToken errors ')' {
-    parser_impl->LogWarning(@1, "unsupported selector within :not()");
-    $$ = NULL;
-  }
-  | ':' errors {
-    parser_impl->LogWarning(@1, "unsupported pseudo-class");
-    $$ = NULL;
-  }
-  ;
-
-// Pseudo-elements create abstractions about the document tree beyond those
-// specified by the document language.
-//   https://www.w3.org/TR/selectors4/#pseudo-elements
-pseudo_element_token:
-// Authors specify the style and location of generated content with the
-// :before and :after pseudo-elements.
-//   https://www.w3.org/TR/CSS21/generate.html#before-after-content
-// User agents must also accept the previous one-colon notation for
-// pseudo-elements introduced in CSS levels 1 and 2.
-//   https://www.w3.org/TR/selectors4/#pseudo-elements
-    ':' kAfterToken {
-    $$ = new cssom::AfterPseudoElement();
-  }
-  | ':' kBeforeToken {
-    $$ = new cssom::BeforePseudoElement();
-  }
-  | ':' ':' kAfterToken {
-    $$ = new cssom::AfterPseudoElement();
-  }
-  | ':' ':' kBeforeToken {
-    $$ = new cssom::BeforePseudoElement();
-  }
-  | ':' ':' errors {
-    parser_impl->LogWarning(@1, "unsupported pseudo-element");
-    $$ = NULL;
-  }
-  ;
-
-// A simple selector represents an aspect of an element to be matched against.
-//   https://www.w3.org/TR/selectors4/#simple
-simple_selector_token:
-    attribute_selector_token
-  | class_selector_token
-  | id_selector_token
-  | pseudo_class_token
-  | pseudo_element_token
-  | type_selector_token
-  | universal_selector_token
-  ;
-
-// A compound selector is a chain of simple selectors that are not separated by
-// a combinator.
-//   https://www.w3.org/TR/selectors4/#compound
-compound_selector_token:
-    simple_selector_token {
-    scoped_ptr<cssom::SimpleSelector> simple_selector($1);
-
-    if (simple_selector) {
-      $$ = new cssom::CompoundSelector();
-      $$->AppendSelector(simple_selector.Pass());
-    } else {
-      $$ = NULL;
-    }
-  }
-  | compound_selector_token simple_selector_token {
-    scoped_ptr<cssom::CompoundSelector> compound_selector($1);
-    scoped_ptr<cssom::SimpleSelector> simple_selector($2);
-
-    if (compound_selector && simple_selector) {
-      $$ = compound_selector.release();
-      $$->AppendSelector(simple_selector.Pass());
-    } else {
-      $$ = NULL;
-    }
-  }
-  ;
-
-// A combinator is punctuation that represents a particular kind of relationship
-// between the selectors on either side.
-//   https://www.w3.org/TR/selectors4/#combinator
-combinator:
-    kWhitespaceToken {
-    $$ = new cssom::DescendantCombinator();
-  }
-  | '>' maybe_whitespace {
-    $$ = new cssom::ChildCombinator();
-  }
-  | '+' maybe_whitespace {
-    $$ = new cssom::NextSiblingCombinator();
-  }
-  | '~' maybe_whitespace {
-    $$ = new cssom::FollowingSiblingCombinator();
-  }
-  ;
-
-// A complex selector is a chain of one or more compound selectors separated by
-// combinators.
-//   https://www.w3.org/TR/selectors4/#complex
-complex_selector:
-    compound_selector_token {
-    scoped_ptr<cssom::CompoundSelector> compound_selector($1);
-
-    if (compound_selector) {
-      $$ = new cssom::ComplexSelector();
-      $$->AppendSelector(compound_selector.Pass());
-    } else {
-      $$ = NULL;
-    }
-  }
-  | complex_selector combinator compound_selector_token {
-    scoped_ptr<cssom::ComplexSelector> complex_selector($1);
-    scoped_ptr<cssom::Combinator> combinator($2);
-    scoped_ptr<cssom::CompoundSelector> compound_selector($3);
-
-    if (complex_selector && compound_selector) {
-      $$ = complex_selector.release();
-      $$->AppendCombinatorAndSelector(combinator.Pass(),
-          compound_selector.Pass());
-    } else {
-      $$ = NULL;
-    }
-  }
-  | complex_selector kWhitespaceToken
-  ;
-
-// A selector list is a comma-separated list of selectors.
-//   https://www.w3.org/TR/selectors4/#selector-list
-selector_list:
-    complex_selector {
-    scoped_ptr<cssom::ComplexSelector> complex_selector($1);
-
-    if (complex_selector) {
-      $$ = new cssom::Selectors();
-      $$->push_back(complex_selector.release());
-    } else {
-      $$ = NULL;
-    }
-  }
-  | selector_list comma complex_selector {
-    scoped_ptr<cssom::Selectors> selector_list($1);
-    scoped_ptr<cssom::ComplexSelector> complex_selector($3);
-
-    if (selector_list && complex_selector) {
-      $$ = selector_list.release();
-      $$->push_back(complex_selector.release());
-    } else {
-      $$ = NULL;
-    }
-  }
-  ;
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Common rules used in property values.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-auto:
-    kAutoToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetAuto().get());
-  }
-
-// The scanner that we adopted from WebKit was built with assumption that sign
-// is handled in the grammar. Practically this means that tokens of <number>
-// and <real> types has to be prepended with this rule.
-//   https://www.w3.org/TR/css3-syntax/#consume-a-number
-maybe_sign_token:
-    /* empty */ { $$ = 1; }
-  | '+' { $$ = 1; }
-  | '-' { $$ = -1; }
-  ;
-
-// This is for integers that can only have the values 0 or 1, including '-0'.
-// As used in the 'grid' css media feature:
-//   https://www.w3.org/TR/css3-mediaqueries/#grid
-zero_or_one:
-    integer {
-    if (($1 < 0) || ($1 > 1)) {
-      parser_impl->LogError(@1, "integer value must be 0 or 1");
-      YYERROR;
-    }
-    $$ = $1;
-  }
-  ;
-
-// An integer is one or more decimal digits "0" through "9". The first digit
-// of an integer may be immediately preceded by "-" or "+" to indicate the sign.
-//   https://www.w3.org/TR/css3-values/#integers
-integer:
-    maybe_sign_token kIntegerToken maybe_whitespace {
-    $$ = $1 * $2;
-  }
-  ;
-
-// Wrap the |integer| in order to validate if the integer is not negative
-non_negative_integer:
-    integer {
-    if ($1 < 0) {
-      parser_impl->LogError(@1, "integer value must not be negative");
-      YYERROR;
-    }
-    $$ = $1;
-  }
-  ;
-
-// Wrap the |integer| in order to validate if the integer is positive
-positive_integer:
-    integer {
-    if ($1 < 1) {
-      parser_impl->LogError(@1, "integer value must be positive");
-      YYERROR;
-    }
-    $$ = $1;
-  }
-  ;
-
-// A number is either an |integer| or zero or more decimal digits followed
-// by a dot followed by one or more decimal digits.
-//   https://www.w3.org/TR/css3-values/#numbers
-number:
-    integer { $$ = $1; }
-  | maybe_sign_token kRealToken maybe_whitespace { $$ = $1 * $2; }
-  ;
-
-// Wrap |number| and validates that it is not negative.
-non_negative_number:
-    number {
-    if ($1 < 0) {
-      parser_impl->LogError(@1, "number value must not be negative");
-      YYERROR;
-    }
-    $$ = $1;
-  }
-  ;
-
-// Percentage values are always relative to another value, for example a length.
-// Each property that allows percentages also defines the value to which
-// the percentage refers.
-//   https://www.w3.org/TR/css3-values/#percentages
-percentage:
-    maybe_sign_token kPercentageToken maybe_whitespace {
-    $$ = AddRef(new cssom::PercentageValue($1 * $2 / 100));
-  }
-  ;
-
-// Wrap the |percentage| in order to validate if the percentage is positive.
-positive_percentage:
-    percentage {
-    scoped_refptr<cssom::PercentageValue> percentage =
-        MakeScopedRefPtrAndRelease($1);
-    if (percentage && percentage->value() < 0) {
-      parser_impl->LogError(@1, "negative values of percentage are illegal");
-      YYERROR;
-    }
-    $$ = AddRef(percentage.get());
-  }
-  ;
-
-// Opacity.
-//   https://www.w3.org/TR/css3-color/#alphavaluedt
-alpha:
-    number {
-    // Any values outside the range 0.0 (fully transparent)
-    // to 1.0 (fully opaque) will be clamped to this range.
-    $$ = ClampToRange(0.0f, 1.0f, $1);
-  }
-  ;
-
-// Distance units.
-//   https://www.w3.org/TR/css3-values/#lengths
-length:
-    number {
-    if ($1 != 0) {
-      parser_impl->LogError(
-          @1, "non-zero length is not allowed without unit identifier");
-      YYERROR;
-    }
-    $$ = AddRef(new cssom::LengthValue(0, cssom::kPixelsUnit));
-  }
-  | absolute_or_relative_length { $$ = $1; }
-  ;
-
-absolute_or_relative_length:
-  // Relative lengths.
-  //   https://www.w3.org/TR/css3-values/#relative-lengths
-    maybe_sign_token kFontSizesAkaEmToken maybe_whitespace {
-    $$ = AddRef(new cssom::LengthValue($1 * $2, cssom::kFontSizesAkaEmUnit));
-  }
-  | maybe_sign_token kRootElementFontSizesAkaRemToken maybe_whitespace {
-    $$ = AddRef(new cssom::LengthValue($1 * $2,
-        cssom::kRootElementFontSizesAkaRemUnit));
-  }
-  | maybe_sign_token kViewportWidthPercentsAkaVwToken maybe_whitespace {
-    $$ = AddRef(new cssom::LengthValue($1 * $2,
-        cssom::kViewportWidthPercentsAkaVwUnit));
-  }
-  | maybe_sign_token kViewportHeightPercentsAkaVhToken maybe_whitespace {
-    $$ = AddRef(new cssom::LengthValue($1 * $2,
-        cssom::kViewportHeightPercentsAkaVhUnit));
-  }
-  // Absolute lengths.
-  //   https://www.w3.org/TR/css3-values/#absolute-lengths
-  | maybe_sign_token kPixelsToken maybe_whitespace {
-    $$ = AddRef(new cssom::LengthValue($1 * $2, cssom::kPixelsUnit));
-  }
-  ;
-
-positive_length:
-  length {
-    scoped_refptr<cssom::LengthValue> length(MakeScopedRefPtrAndRelease($1));
-    if (length && length->value() < 0) {
-      parser_impl->LogError(@1, "negative values of length are illegal");
-      YYERROR;
-    }
-    $$ = AddRef(length.get());
-  }
-  ;
-
-// Ratio units.
-//   https://www.w3.org/TR/css3-mediaqueries/#values
-ratio:
-    positive_integer '/' maybe_whitespace positive_integer {
-    $$ = AddRef(new cssom::RatioValue(math::Rational($1, $4)));
-  }
-  ;
-
-// Resolution units.
-//   https://www.w3.org/TR/css3-mediaqueries/#resolution0
-resolution:
-    maybe_sign_token kDotsPerInchToken maybe_whitespace {
-    float value = $1 * $2;
-    if (value <= 0) {
-      parser_impl->LogError(@1, "resolution value must be positive");
-      YYERROR;
-    }
-    $$ = AddRef(new cssom::ResolutionValue(value, cssom::kDPIUnit));
-  }
-  | maybe_sign_token kDotsPerCentimeterToken maybe_whitespace {
-    float value = $1 * $2;
-    if (value <= 0) {
-      parser_impl->LogError(@1, "resolution value must be positive");
-      YYERROR;
-    }
-    $$ = AddRef(new cssom::ResolutionValue(value, cssom::kDPCMUnit));
-  }
-  ;
-
-// Angle units (returned synthetic value will always be in radians).
-//   https://www.w3.org/TR/css3-values/#angles
-angle:
-    maybe_sign_token kDegreesToken maybe_whitespace {
-    $$ = $1 * $2 * (2 * static_cast<float>(M_PI) / 360.0f);
-  }
-  | maybe_sign_token kGradiansToken maybe_whitespace {
-    $$ = $1 * $2 * (2 * static_cast<float>(M_PI) / 400.0f);
-  }
-  | maybe_sign_token kRadiansToken maybe_whitespace {
-    $$ = $1 * $2;
-  }
-  | maybe_sign_token kTurnsToken maybe_whitespace {
-    $$ = $1 * $2 * 2 * static_cast<float>(M_PI);
-  }
-  ;
-
-// Time units (used by animations and transitions).
-//   https://www.w3.org/TR/css3-values/#time
-time:
-    number {
-    $$ = base::TimeDelta::FromMilliseconds(
-             static_cast<int64>($1 * base::Time::kMillisecondsPerSecond)).
-             ToInternalValue();
-    if ($1 != 0) {
-      parser_impl->LogWarning(
-          @1, "non-zero time is not allowed without unit identifier");
-    }
-  }
-  | time_with_units_required
-  ;
-
-time_with_units_required:
-  maybe_sign_token kSecondsToken maybe_whitespace {
-    $$ = base::TimeDelta::FromMilliseconds(
-             static_cast<int64>($1 * $2 * base::Time::kMillisecondsPerSecond)).
-             ToInternalValue();
-  }
-  | maybe_sign_token kMillisecondsToken maybe_whitespace {
-    $$ = base::TimeDelta::FromMilliseconds(static_cast<int64>($1 * $2)).
-             ToInternalValue();
-  }
-  ;
-
-colon: ':' maybe_whitespace ;
-comma: ',' maybe_whitespace ;
-
-// All properties accept the CSS-wide keywords.
-//   https://www.w3.org/TR/css3-values/#common-keywords
-common_values:
-    common_values_without_errors
-  | errors {
-    // If a user agent does not support a particular value, it should ignore
-    // that value when parsing style sheets, as if that value was an illegal
-    // value.
-    //   https://www.w3.org/TR/CSS21/syndata.html#unsupported-values
-    //
-    // User agents must ignore a declaration with an illegal value.
-    //   https://www.w3.org/TR/CSS21/syndata.html#illegalvalues
-    parser_impl->LogWarning(@1, "unsupported value");
-    $$ = NULL;
-  }
-  ;
-
-common_values_without_errors:
-    kInheritToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetInherit().get());
-  }
-  | kInitialToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetInitial().get());
-  }
-  ;
-
-color:
-  // Hexadecimal notation.
-  //   https://www.w3.org/TR/css3-color/#numerical
-    kHexToken maybe_whitespace {
-    switch ($1.size()) {
-      // The three-digit RGB notation (#rgb) is converted into six-digit
-      // form (#rrggbb) by replicating digits.
-      case 3: {
-        uint32 rgb = ParseHexToken($1);
-        uint32 r = (rgb & 0xf00) >> 8;
-        uint32 g = (rgb & 0x0f0) >> 4;
-        uint32 b = (rgb & 0x00f);
-        $$ = AddRef(new cssom::RGBAColorValue((r << 28) | (r << 24) |
-                                              (g << 20) | (g << 16) |
-                                              (b << 12) | (b << 8) |
-                                              0xff));
-        break;
-      }
-      case 6: {
-        uint32 rgb = ParseHexToken($1);
-        $$ = AddRef(new cssom::RGBAColorValue((rgb << 8) | 0xff));
-        break;
-      }
-      default:
-        YYERROR;
-        break;
-    }
-  }
-  // RGB color model.
-  //   https://www.w3.org/TR/css3-color/#rgb-color
-  | kRGBFunctionToken maybe_whitespace integer comma
-      integer comma integer ')' maybe_whitespace {
-    uint8 r = static_cast<uint8>(ClampToRange(0, 255, $3));
-    uint8 g = static_cast<uint8>(ClampToRange(0, 255, $5));
-    uint8 b = static_cast<uint8>(ClampToRange(0, 255, $7));
-    $$ = AddRef(new cssom::RGBAColorValue(r, g, b, 0xff));
-  }
-  // RGB color model with opacity.
-  //   https://www.w3.org/TR/css3-color/#rgba-color
-  | kRGBAFunctionToken maybe_whitespace integer comma integer comma integer
-      comma alpha ')' maybe_whitespace {
-    uint8 r = static_cast<uint8>(ClampToRange(0, 255, $3));
-    uint8 g = static_cast<uint8>(ClampToRange(0, 255, $5));
-    uint8 b = static_cast<uint8>(ClampToRange(0, 255, $7));
-    float a = $9;  // Already clamped.
-    $$ = AddRef(
-        new cssom::RGBAColorValue(r, g, b, static_cast<uint8>(a * 0xff)));
-  }
-  | kAquaToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetAqua().get());
-  }
-  | kBlackToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetBlack().get());
-  }
-  | kBlueToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetBlue().get());
-  }
-  | kFuchsiaToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetFuchsia().get());
-  }
-  | kGrayToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetGray().get());
-  }
-  | kGreenToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetGreen().get());
-  }
-  | kLimeToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetLime().get());
-  }
-  | kMaroonToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetMaroon().get());
-  }
-  | kNavyToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetNavy().get());
-  }
-  | kOliveToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetOlive().get());
-  }
-  | kPurpleToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetPurple().get());
-  }
-  | kRedToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetRed().get());
-  }
-  | kSilverToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetSilver().get());
-  }
-  | kTealToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetTeal().get());
-  }
-  | kTransparentToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetTransparent().get());
-  }
-  | kWhiteToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetWhite().get());
-  }
-  | kYellowToken maybe_whitespace {
-    $$ = AddRef(cssom::RGBAColorValue::GetYellow().get());
-  }
-  ;
-
-url:
-    kUriToken ')' maybe_whitespace {
-    $$ = AddRef(new cssom::URLValue($1.ToString()));
-  }
-  ;
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Property values.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-length_percent_property_value:
-    length {
-    $$ = $1;
-  }
-  | percentage {
-    $$ = $1;
-  }
-  ;
-
-positive_length_percent_property_value:
-    positive_length {
-    $$ = $1;
-  }
-  | positive_percentage {
-    $$ = $1;
-  }
-  ;
-
-background_property_element:
-    color {
-    scoped_refptr<cssom::PropertyValue> color(MakeScopedRefPtrAndRelease($1));
-    if (!$<background_shorthand_layer>0->background_color) {
-      $<background_shorthand_layer>0->background_color = color;
-    } else {
-      parser_impl->LogError(
-          @1, "background-color value declared twice in background.");
-      $<background_shorthand_layer>0->error = true;
-    }
-  }
-  | background_image_property_list_element {
-    scoped_refptr<cssom::PropertyValue> image(MakeScopedRefPtrAndRelease($1));
-    if (!$<background_shorthand_layer>0->background_image) {
-      scoped_ptr<cssom::PropertyListValue::Builder>
-          background_image_builder(new cssom::PropertyListValue::Builder());
-      background_image_builder->reserve(1);
-      background_image_builder->push_back(image);
-      $<background_shorthand_layer>0->background_image =
-          new cssom::PropertyListValue(background_image_builder.Pass());
-    } else {
-      parser_impl->LogError(
-          @1, "background-image value declared twice in background.");
-      $<background_shorthand_layer>0->error = true;
-    }
-  }
-  ;
-
-maybe_background_size_property_value:
-    /* empty */ {
-    $$ = NULL;
-  }
-  | '/' maybe_whitespace background_size_property_value_without_common_values {
-    $$ = $3;
-  }
-  ;
-
-background_position_and_size_shorthand_property_value:
-    validated_position_property
-    maybe_background_size_property_value {
-    scoped_ptr<BackgroundShorthandLayer> shorthand_layer(
-        new BackgroundShorthandLayer());
-
-    shorthand_layer->background_position = MakeScopedRefPtrAndRelease($1);
-    if ($2) {
-      shorthand_layer->background_size = MakeScopedRefPtrAndRelease($2);
-    }
-
-    $$ = shorthand_layer.release();
-  }
-  ;
-
-background_repeat_shorthand_property_value:
-    background_repeat_property_value_without_common_values {
-    scoped_ptr<BackgroundShorthandLayer> shorthand_layer(
-        new BackgroundShorthandLayer());
-    shorthand_layer->background_repeat = MakeScopedRefPtrAndRelease($1);
-    $$ = shorthand_layer.release();
-  }
-  ;
-
-
-// 'background-size' property should follow with 'background-position' property
-//  and a '/'.
-background_position_and_repeat_combination:
-    background_position_and_size_shorthand_property_value
-  | background_repeat_shorthand_property_value
-  | background_position_and_size_shorthand_property_value
-    background_repeat_shorthand_property_value {
-    scoped_ptr<BackgroundShorthandLayer> shorthand_layer($1);
-    scoped_ptr<BackgroundShorthandLayer> non_overlapped($2);
-    shorthand_layer->IntegrateNonOverlapped(*non_overlapped);
-    $$ = shorthand_layer.release();
-  }
-  | background_repeat_shorthand_property_value
-    background_position_and_size_shorthand_property_value {
-    scoped_ptr<BackgroundShorthandLayer> shorthand_layer($1);
-    scoped_ptr<BackgroundShorthandLayer> non_overlapped($2);
-    shorthand_layer->IntegrateNonOverlapped(*non_overlapped);
-    $$ = shorthand_layer.release();
-  }
-  ;
-
-final_background_layer_without_position_and_repeat:
-    /* empty */ {
-    // Initialize the background shorthand which is to be filled in by
-    // subsequent reductions.
-    $$ = new BackgroundShorthandLayer();
-  }
-  | final_background_layer background_property_element {
-    // Propagate the return value from the reduced list.
-    // Appending of the new background_property_element to the list is done
-    // within background_property_element's reduction.
-    $$ = $1;
-  }
-  ;
-
-// Only the final background layer is allowed to set the background color.
-//   https://www.w3.org/TR/css3-background/#ltfinal-bg-layergt
-final_background_layer:
-    /* empty */ {
-    // Initialize the background shorthand which is to be filled in by
-    // subsequent reductions.
-    $$ = new BackgroundShorthandLayer();
-  }
-  | final_background_layer_without_position_and_repeat
-    background_position_and_repeat_combination {
-    scoped_ptr<BackgroundShorthandLayer> shorthand($1);
-    scoped_ptr<BackgroundShorthandLayer> background_values($2);
-    if (!shorthand->IsBackgroundPropertyOverlapped(*background_values.get())) {
-      shorthand->IntegrateNonOverlapped(*background_values.get());
-      $$ = shorthand.release();
-    } else {
-      parser_impl->LogError(
-          @1, "background-position or background-repeat declared twice in "
-              "background.");
-      $$ = new BackgroundShorthandLayer();
-      $$->error = true;
-    }
-  }
-  | final_background_layer background_property_element {
-    // Propagate the return value from the reduced list.
-    // Appending of the new background_property_element to the list is done
-    // within background_property_element's reduction.
-    $$ = $1;
-  }
-  ;
-
-// Shorthand property for setting most background properties at the same place.
-//   https://www.w3.org/TR/css3-background/#the-background
-background_property_value:
-    final_background_layer
-  | common_values {
-    // Replicate the common value into each of the properties that background
-    // is a shorthand for.
-    scoped_ptr<BackgroundShorthandLayer> background(
-        new BackgroundShorthandLayer());
-    background->background_color = $1;
-    background->background_image = $1;
-    background->background_repeat = $1;
-    background->background_position = $1;
-    background->background_size = $1;
-    $$ = background.release();
-  }
-  ;
-
-// Background color of an element drawn behind any background images.
-//   https://www.w3.org/TR/css3-background/#the-background-color
-background_color_property_value:
-    color { $$ = $1; }
-  | common_values
-  ;
-
-color_stop:
-    color {
-    $$ = new cssom::ColorStop(MakeScopedRefPtrAndRelease($1));
-  }
-  | color length_percent_property_value {
-    $$ = new cssom::ColorStop(MakeScopedRefPtrAndRelease($1),
-                              MakeScopedRefPtrAndRelease($2));
-  }
-  ;
-
-// Only 2 or more color stops can make a valid color stop list.
-comma_separated_color_stop_list:
-    color_stop comma color_stop {
-    $$ = new cssom::ColorStopList();
-    $$->push_back($1);
-    $$->push_back($3);
-  }
-  | comma_separated_color_stop_list comma color_stop {
-    $$ = $1;
-    $$->push_back($3);
-  }
-  ;
-
-side:
-    kBottomToken maybe_whitespace {
-    $$ = cssom::LinearGradientValue::kBottom;
-  }
-  | kLeftToken maybe_whitespace {
-    $$ = cssom::LinearGradientValue::kLeft;
-  }
-  | kRightToken maybe_whitespace {
-    $$ = cssom::LinearGradientValue::kRight;
-  }
-  | kTopToken maybe_whitespace {
-    $$ = cssom::LinearGradientValue::kTop;
-  }
-  ;
-
-side_or_corner:
-    side
-  | side side {
-    if ($1 == cssom::LinearGradientValue::kBottom) {
-      if($2 == cssom::LinearGradientValue::kLeft) {
-        $$ = cssom::LinearGradientValue::kBottomLeft;
-      } else if ($2 == cssom::LinearGradientValue::kRight) {
-        $$ = cssom::LinearGradientValue::kBottomRight;
-      } else {
-        parser_impl->LogWarning(@1, "Illegal corner value.");
-      }
-    } else if ($1 == cssom::LinearGradientValue::kLeft) {
-      if($2 == cssom::LinearGradientValue::kBottom) {
-        $$ = cssom::LinearGradientValue::kBottomLeft;
-      } else if ($2 == cssom::LinearGradientValue::kTop) {
-        $$ = cssom::LinearGradientValue::kTopLeft;
-      } else {
-        parser_impl->LogWarning(@1, "Illegal corner value.");
-      }
-    } else if ($1 == cssom::LinearGradientValue::kRight) {
-      if($2 == cssom::LinearGradientValue::kBottom) {
-        $$ = cssom::LinearGradientValue::kBottomRight;
-      } else if ($2 == cssom::LinearGradientValue::kTop) {
-        $$ = cssom::LinearGradientValue::kTopRight;
-      } else {
-        parser_impl->LogWarning(@1, "Illegal corner value.");
-      }
-    } else if ($1 == cssom::LinearGradientValue::kTop) {
-      if($2 == cssom::LinearGradientValue::kLeft) {
-        $$ = cssom::LinearGradientValue::kTopLeft;
-      } else if ($2 == cssom::LinearGradientValue::kRight) {
-        $$ = cssom::LinearGradientValue::kTopRight;
-      } else {
-        parser_impl->LogWarning(@1, "Illegal corner value.");
-      }
-    }
-  }
-  ;
-
-linear_gradient_params:
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($1);
-    // If the first argument to the linear gradient function is omitted, it
-    // defaults to 'to bottom'.
-    $$ = AddRef(new cssom::LinearGradientValue(
-             cssom::LinearGradientValue::kBottom, color_stop_list->Pass()));
-  }
-  | angle comma comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($3);
-    $$ = AddRef(new cssom::LinearGradientValue($1, color_stop_list->Pass()));
-  }
-  | kToToken kWhitespaceToken maybe_whitespace side_or_corner comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($6);
-    $$ = AddRef(new cssom::LinearGradientValue($4, color_stop_list->Pass()));
-  }
-  ;
-
-size_keyword:
-    kClosestSideToken maybe_whitespace {
-    $$ = cssom::RadialGradientValue::kClosestSide;
-  }
-  | kFarthestSideToken maybe_whitespace {
-    $$ = cssom::RadialGradientValue::kFarthestSide;
-  }
-  | kClosestCornerToken maybe_whitespace {
-    $$ = cssom::RadialGradientValue::kClosestCorner;
-  }
-  | kFarthestCornerToken maybe_whitespace {
-    $$ = cssom::RadialGradientValue::kFarthestCorner;
-  }
-  ;
-
-circle_with_size_keyword:
-    kCircleToken maybe_whitespace size_keyword {
-    $$ = $3;
-  }
-  | size_keyword kCircleToken maybe_whitespace {
-    $$ = $1;
-  }
-  ;
-
-// If <shape> is specified as 'circle' or is omitted, the <size> may be
-// given explicitly as a single <length> which gives the radius of the
-// circle explicitly. Negative values are invalid.
-circle_with_positive_length:
-    positive_length {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-       new cssom::PropertyListValue::Builder());
-    property_value->reserve(1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($1));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  | positive_length kCircleToken maybe_whitespace {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-       new cssom::PropertyListValue::Builder());
-    property_value->reserve(1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($1));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  | kCircleToken maybe_whitespace positive_length {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-       new cssom::PropertyListValue::Builder());
-    property_value->reserve(1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($3));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-maybe_ellipse_with_size_keyword:
-    kEllipseToken maybe_whitespace size_keyword {
-    $$ = $3;
-  }
-  | size_keyword kEllipseToken maybe_whitespace {
-    $$ = $1;
-  }
-  | size_keyword {
-    // If only a size keyword is specified, the ending shape defaults to an
-    // ellipse.
-    $$ = $1;
-  }
-  ;
-
-// If <shape> is specified as 'ellipse' or is omitted, the <size> may be
-// given explicitly as [<length> | <percentage>]{2} which gives the size of
-// the ellipse explicitly. Negative values are invalid.
-ellipse_with_2_positive_length_percents:
-    positive_length_percent_property_value
-    positive_length_percent_property_value {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->reserve(2);
-    property_value->push_back(MakeScopedRefPtrAndRelease($1));
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  | positive_length_percent_property_value
-    positive_length_percent_property_value kEllipseToken maybe_whitespace {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->reserve(2);
-    property_value->push_back(MakeScopedRefPtrAndRelease($1));
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  | kEllipseToken maybe_whitespace positive_length_percent_property_value
-    positive_length_percent_property_value {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->reserve(2);
-    property_value->push_back(MakeScopedRefPtrAndRelease($3));
-    property_value->push_back(MakeScopedRefPtrAndRelease($4));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-at_position:
-    kAtToken maybe_whitespace validated_position_property {
-    $$ = $3;
-  }
-  ;
-
-maybe_at_position:
-    /* empty */ {
-    $$ = NULL;
-  }
-  | at_position
-  ;
-
-//   https://www.w3.org/TR/css3-images/#radial-gradients
-radial_gradient_params:
-    circle_with_positive_length maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($4);
-    $$ = AddRef(
-        new cssom::RadialGradientValue(cssom::RadialGradientValue::kCircle,
-                                       MakeScopedRefPtrAndRelease($1),
-                                       MakeScopedRefPtrAndRelease($2),
-                                       color_stop_list->Pass()));
-  }
-  | ellipse_with_2_positive_length_percents maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($4);
-    $$ = AddRef(
-        new cssom::RadialGradientValue(cssom::RadialGradientValue::kEllipse,
-                                       MakeScopedRefPtrAndRelease($1),
-                                       MakeScopedRefPtrAndRelease($2),
-                                       color_stop_list->Pass()));
-  }
-  | circle_with_size_keyword maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($4);
-    $$ = AddRef(
-        new cssom::RadialGradientValue(cssom::RadialGradientValue::kCircle,
-                                       $1,
-                                       MakeScopedRefPtrAndRelease($2),
-                                       color_stop_list->Pass()));
-  }
-  | maybe_ellipse_with_size_keyword maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($4);
-    $$ = AddRef(
-        new cssom::RadialGradientValue(cssom::RadialGradientValue::kEllipse,
-                                       $1,
-                                       MakeScopedRefPtrAndRelease($2),
-                                       color_stop_list->Pass()));
-  }
-  | kCircleToken maybe_whitespace maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($5);
-    $$ = AddRef(new cssom::RadialGradientValue(
-            cssom::RadialGradientValue::kCircle,
-            cssom::RadialGradientValue::kFarthestCorner,
-            MakeScopedRefPtrAndRelease($3),
-            color_stop_list->Pass()));
-  }
-  | kEllipseToken maybe_whitespace maybe_at_position comma
-    comma_separated_color_stop_list {
-    scoped_ptr<cssom::ColorStopList> color_stop_list($5);
-    $$ = AddRef(new cssom::RadialGradientValue(
-            cssom::RadialGradientValue::kEllipse,
-            cssom::RadialGradientValue::kFarthestCorner,
-            MakeScopedRefPtrAndRelease($3),
-            color_stop_list->Pass()));
-  }
-  | at_position comma comma_separated_color_stop_list {
-    // If no size or shape is specified, the ending shape defaults to an ellipse
-    // and the size defaults to 'farthest-corner'.
-    scoped_ptr<cssom::ColorStopList> color_stop_list($3);
-    $$ = AddRef(new cssom::RadialGradientValue(
-            cssom::RadialGradientValue::kEllipse,
-            cssom::RadialGradientValue::kFarthestCorner,
-            MakeScopedRefPtrAndRelease($1),
-            color_stop_list->Pass()));
-  }
-  | comma_separated_color_stop_list {
-    // If position is omitted as well, it defaults to 'center', indicated by
-    // passing in NULL.
-    scoped_ptr<cssom::ColorStopList> color_stop_list($1);
-    $$ = AddRef(new cssom::RadialGradientValue(
-            cssom::RadialGradientValue::kEllipse,
-            cssom::RadialGradientValue::kFarthestCorner,
-            NULL,
-            color_stop_list->Pass()));
-  }
-  ;
-
-background_image_property_list_element:
-    url { $$ = $1; }
-  | kLinearGradientFunctionToken maybe_whitespace linear_gradient_params ')' {
-    $$ = $3;
-  }
-  | kRadialGradientFunctionToken maybe_whitespace radial_gradient_params ')' {
-    $$ = $3;
-  }
-  | kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  ;
-
-comma_separated_background_image_list:
-    background_image_property_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_background_image_list comma
-    background_image_property_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-// Images are drawn with the first specified one on top (closest to the user)
-// and each subsequent image behind the previous one.
-//   https://www.w3.org/TR/css3-background/#the-background-image
-background_image_property_value:
-  comma_separated_background_image_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  | common_values
-  ;
-
-position_list_element:
-    kBottomToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBottom().get());
-  }
-  | kCenterToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetCenter().get());
-  }
-  | kLeftToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetLeft().get());
-  }
-  | kRightToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetRight().get());
-  }
-  | kTopToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetTop().get());
-  }
-  | length_percent_property_value
-  ;
-
-position_list:
-    position_list_element {
-    scoped_ptr<PositionParseStructure> position_info(
-        new PositionParseStructure());
-    position_info->PushBackElement(MakeScopedRefPtrAndRelease($1));
-    $$ = position_info.release();
-  }
-  | position_list
-    position_list_element {
-    scoped_ptr<PositionParseStructure> position_info($1);
-    scoped_refptr<cssom::PropertyValue> element(MakeScopedRefPtrAndRelease($2));
-    if (position_info &&
-        !position_info->PushBackElement(element)) {
-      parser_impl->LogWarning(@2, "invalid background position value");
-      $$ = NULL;
-    } else {
-      $$ = position_info.release();
-    }
-  }
-  ;
-
-validated_position_property:
-    position_list {
-    scoped_ptr<PositionParseStructure> position_info($1);
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value;
-
-    if (!position_info) {
-      // No-ops.
-    } else if (position_info->position_builder().size() == 1) {
-      property_value.reset(new cssom::PropertyListValue::Builder(
-          position_info->position_builder()));
-    } else if (position_info->position_builder().size() == 2 &&
-               !position_info->IsPositionValidOnSizeTwo()) {
-      parser_impl->LogWarning(@1, "invalid background position value");
-      // No-ops.
-    } else {
-      DCHECK_GE(position_info->position_builder().size(), 2u);
-      DCHECK_LE(position_info->position_builder().size(), 4u);
-      property_value.reset(new cssom::PropertyListValue::Builder(
-          position_info->position_builder()));
-    }
-
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  ;
-
-// If background images have been specified, this property specifies their
-// initial position (after any resizing) within their corresponding background
-// positioning area.
-//   https://www.w3.org/TR/css3-background/#the-background-position
-background_position_property_value:
-    validated_position_property {
-    $$ = $1;
-  }
-  | common_values
-  ;
-
-// Specifies how background images are tiled after they have been sized and
-// positioned.
-//   https://www.w3.org/TR/css3-background/#the-background-repeat
-background_repeat_element:
-    kNoRepeatToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNoRepeat().get());
-  }
-  | kRepeatToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetRepeat().get());
-  }
-  ;
-
-background_repeat_property_value_without_common_values:
-    background_repeat_element {
-    scoped_ptr<cssom::PropertyListValue::Builder> builder(
-        new cssom::PropertyListValue::Builder());
-    builder->reserve(2);
-    builder->push_back(MakeScopedRefPtrAndRelease($1));
-    builder->push_back($1);
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  | background_repeat_element background_repeat_element {
-    scoped_ptr<cssom::PropertyListValue::Builder> builder(
-        new cssom::PropertyListValue::Builder());
-    builder->reserve(2);
-    builder->push_back(MakeScopedRefPtrAndRelease($1));
-    builder->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  | kRepeatXToken maybe_whitespace {
-    scoped_ptr<cssom::PropertyListValue::Builder> builder(
-        new cssom::PropertyListValue::Builder());
-    builder->reserve(2);
-    builder->push_back(cssom::KeywordValue::GetRepeat().get());
-    builder->push_back(cssom::KeywordValue::GetNoRepeat().get());
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  | kRepeatYToken maybe_whitespace {
-    scoped_ptr<cssom::PropertyListValue::Builder> builder(
-        new cssom::PropertyListValue::Builder());
-    builder->reserve(2);
-    builder->push_back(cssom::KeywordValue::GetNoRepeat().get());
-    builder->push_back(cssom::KeywordValue::GetRepeat().get());
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  ;
-
-background_repeat_property_value:
-    background_repeat_property_value_without_common_values
-  | common_values
-  ;
-
-background_size_property_list_element:
-    length { $$ = $1; }
-  | positive_percentage { $$ = $1; }
-  | auto
-  ;
-
-background_size_property_list:
-    background_size_property_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->reserve(2);
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-    // Fill in the omitted 'auto'.
-    $$->push_back(cssom::KeywordValue::GetAuto().get());
-  }
-  | background_size_property_list_element
-    background_size_property_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->reserve(2);
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-    $$->push_back(MakeScopedRefPtrAndRelease($2));
-  }
-  ;
-
-// Specifies the size of the background images.
-//   https://www.w3.org/TR/css3-background/#the-background-size
-background_size_property_value_without_common_values:
-    background_size_property_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  | kContainToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetContain().get());
-  }
-  | kCoverToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetCover().get());
-  }
-  ;
-
-background_size_property_value:
-    background_size_property_value_without_common_values
-  | common_values
-  ;
-
-// 'border-color' sets the foreground color of the border specified by the
-// border-style properties.
-//   https://www.w3.org/TR/css3-background/#border-color
-border_color_property_list:
-    /* empty */ {
-    $$ = new cssom::PropertyListValue::Builder();
-  }
-  | border_color_property_list color {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = property_value.release();
-  }
-  ;
-
-border_color_property_value:
-    border_color_property_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    if (property_value->size() > 0u &&
-        property_value->size() <= 4u) {
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    } else {
-      parser_impl->LogWarning(@1, "invalid number of border color values");
-      $$ = NULL;
-    }
-  }
-  | common_values {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->push_back($1);
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-//   https://www.w3.org/TR/css3-background/#ltline-stylegt
-line_style:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kHiddenToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetHidden().get());
-  }
-  | kSolidToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetSolid().get());
-  }
-  ;
-
-line_style_with_common_values:
-    line_style
-  | common_values;
-  ;
-
-// 'border-style' sets the style of the border, unless there is a border-image.
-//   https://www.w3.org/TR/css3-background/#border-style
-border_style_property_list:
-    /* empty */ {
-    $$ = new cssom::PropertyListValue::Builder();
-  }
-  | border_style_property_list line_style {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = property_value.release();
-  }
-  ;
-
-border_style_property_value:
-    border_style_property_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    if (property_value->size() > 0u &&
-        property_value->size() <= 4u) {
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    } else {
-      parser_impl->LogWarning(@1, "invalid number of border style values");
-      $$ = NULL;
-    }
-  }
-  | common_values {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->push_back($1);
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-// 'border-width' sets the thickness of the border.
-//   https://www.w3.org/TR/css3-background/#border-width
-border_width_element:
-    positive_length  { $$ = $1; }
-  ;
-
-border_width_element_with_common_values:
-    border_width_element
-  | common_values
-  ;
-
-border_width_property_list:
-    /* empty */ {
-    $$ = new cssom::PropertyListValue::Builder();
-  }
-  | border_width_property_list border_width_element {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = property_value.release();
-  }
-  ;
-
-border_width_property_value:
-    border_width_property_list  {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    if (property_value->size() > 0u &&
-        property_value->size() <= 4u) {
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    } else {
-      parser_impl->LogWarning(@1, "invalid number of border width values");
-      $$ = NULL;
-    }
-  }
-  | common_values {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->push_back($1);
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-// border_or_outline_property_element represents a component of a single border
-// property. It uses $0 to access its parent's BorderOrOutlineShorthand object
-// and build it, so it should always be used to the right of a border shorthand
-// object.
-// The 'border' and 'outline' properties are shorthand properties for setting
-// the same width, color, and style for all four borders of a box. Unlike the
-// shorthand 'margin' and 'padding' properties, the 'border' property cannot set
-// different values on the four borders.
-border_or_outline_property_element:
-    color {
-    scoped_refptr<cssom::PropertyValue> color(MakeScopedRefPtrAndRelease($1));
-    if (!$<border_or_outline_shorthand>0->color) {
-      $<border_or_outline_shorthand>0->color = color;
-    } else {
-      parser_impl->LogError(
-          @1, "color value declared twice in border or outline.");
-      $<border_or_outline_shorthand>0->error = true;
-    }
-  }
-  | line_style {
-    scoped_refptr<cssom::PropertyValue> line_style =
-        MakeScopedRefPtrAndRelease($1);
-    if (!$<border_or_outline_shorthand>0->style) {
-      $<border_or_outline_shorthand>0->style = line_style;
-    } else {
-      parser_impl->LogError(
-          @1, "style value declared twice in border or outline.");
-      $<border_or_outline_shorthand>0->error = true;
-    }
-  }
-  | positive_length {
-    scoped_refptr<cssom::PropertyValue> positive_length =
-        MakeScopedRefPtrAndRelease($1);
-    if (!$<border_or_outline_shorthand>0->width) {
-      $<border_or_outline_shorthand>0->width = positive_length;
-    } else {
-      parser_impl->LogError(
-          @1, "width value declared twice in border or outline.");
-      $<border_or_outline_shorthand>0->error = true;
-    }
-  }
-  ;
-
-border_or_outline_property_list:
-    /* empty */ {
-    $$ = new BorderOrOutlineShorthand();
-  }
-  | border_or_outline_property_list border_or_outline_property_element {
-    $$ = $1;
-  }
-  ;
-
-// TODO: Support border-image.
-// The border can either be a predefined style (solid line, double line, dotted
-// line, pseudo-3D border, etc.) or it can be an image. In the former case,
-// various properties define the style ('border-style'), color ('border-color'),
-// and thickness ('border-width') of the border.
-//   https://www.w3.org/TR/css3-background/#borders
-border_or_outline_property_value:
-    border_or_outline_property_list
-  | common_values {
-    // Replicate the common value into each of the properties that border is a
-    // shorthand for.
-    scoped_ptr<BorderOrOutlineShorthand> border(new BorderOrOutlineShorthand());
-    border->color = $1;
-    border->style = $1;
-    border->width = $1;
-    $$ = border.release();
-  }
-  ;
-
-// The radii of a quarter ellipse that defines the shape of the corner
-// of the outer border edge.
-//   https://www.w3.org/TR/css3-background/#the-border-radius
-border_radius_element:
-    positive_length_percent_property_value { $$ = $1; }
-  ;
-border_radius_element_with_common_values:
-    border_radius_element
-  | common_values
-  ;
-
-border_radius_property_list:
-    /* empty */ {
-    $$ = new cssom::PropertyListValue::Builder();
-  }
-  | border_radius_property_list border_radius_element {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    property_value->push_back(MakeScopedRefPtrAndRelease($2));
-    $$ = property_value.release();
-  }
-  ;
-
-border_radius_property_value:
-    border_radius_property_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    if (property_value->size() > 0u &&
-        property_value->size() <= 4u) {
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    } else {
-      parser_impl->LogWarning(@1, "invalid number of border radius values");
-      $$ = NULL;
-    }
-  }
-  | common_values {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->push_back($1);
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  ;
-
-box_shadow_property_element:
-    length {
-    if ($<shadow_info>0->length_vector.size() == 2) {
-      scoped_refptr<cssom::LengthValue> length(MakeScopedRefPtrAndRelease($1));
-      // Negative values are not allowed for blur radius.
-      if (length && length->value() < 0) {
-        parser_impl->LogError(@1, "negative values of blur radius are illegal");
-        $<shadow_info>0->error = true;
-      }
-      $<shadow_info>0->length_vector.push_back(length);
-    } else {
-      $<shadow_info>0->length_vector.push_back(
-          MakeScopedRefPtrAndRelease($1));
-    }
-  }
-  | color {
-    scoped_refptr<cssom::RGBAColorValue> color(MakeScopedRefPtrAndRelease($1));
-    if (!$<shadow_info>0->color) {
-      $<shadow_info>0->color = color;
-    } else {
-      parser_impl->LogError(@1, "color value declared twice in box shadow.");
-      $<shadow_info>0->error = true;
-    }
-  }
-  | kInsetToken maybe_whitespace {
-    if (!$<shadow_info>0->has_inset) {
-      $<shadow_info>0->has_inset = true;
-    } else {
-      parser_impl->LogError(@1, "inset value declared twice in box shadow.");
-      $<shadow_info>0->error = true;
-    }
-  }
-  ;
-
-box_shadow_list:
-    /* empty */ {
-    $$ = new ShadowPropertyInfo();
-  }
-  | box_shadow_list box_shadow_property_element {
-    $$ = $1;
-  }
-  ;
-
-validated_box_shadow_list:
-    box_shadow_list {
-    scoped_ptr<ShadowPropertyInfo> shadow_property_info($1);
-    if (!shadow_property_info->IsShadowPropertyValid(kBoxShadow)) {
-      parser_impl->LogWarning(@1, "invalid box shadow property.");
-      $$ = NULL;
-    } else {
-      $$ = AddRef(new cssom::ShadowValue(
-              shadow_property_info->length_vector, shadow_property_info->color,
-              shadow_property_info->has_inset));
-    }
-  }
-  ;
-
-comma_separated_box_shadow_list:
-    validated_box_shadow_list {
-    scoped_refptr<cssom::PropertyValue> shadow = MakeScopedRefPtrAndRelease($1);
-    if (shadow) {
-      $$ = new cssom::PropertyListValue::Builder();
-      $$->push_back(shadow);
-    }
-  }
-  | comma_separated_box_shadow_list comma validated_box_shadow_list {
-    $$ = $1;
-    scoped_refptr<cssom::PropertyValue> shadow = MakeScopedRefPtrAndRelease($3);
-    if ($$ && shadow) {
-      $$->push_back(shadow);
-    }
-  }
-  ;
-
-// The 'box-shadow' property attaches one or more drop-shadows to the box.
-// The property takes a comma-separated list of shadows, ordered front to back.
-//   https://www.w3.org/TR/css3-background/#box-shadow
-box_shadow_property_value:
-    comma_separated_box_shadow_list {
-    if ($1) {
-      scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    }
-  }
-  | kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | common_values
-  ;
-
-// Foreground color of an element's text content.
-//   https://www.w3.org/TR/css3-color/#foreground
-color_property_value:
-    color { $$ = $1; }
-  | common_values
-  ;
-
-// Used to add generated content with a :before or :after pseudo-element.
-//   https://www.w3.org/TR/CSS21/generate.html#content
-content_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNormal().get());
-  }
-  | url { $$ = $1; }
-  | kStringToken maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1.ToString()));
-  }
-  | common_values
-;
-
-// Controls the generation of boxes.
-//   https://www.w3.org/TR/CSS21/visuren.html#display-prop
-display_property_value:
-    kBlockToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBlock().get());
-  }
-  | kInlineToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetInline().get());
-  }
-  | kInlineBlockToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetInlineBlock().get());
-  }
-  | kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | common_values
-  ;
-
-// External font-face references consist of a URL, followed by an optional
-// hint describing the format of the font resource referenced by that URL.
-//   https://www.w3.org/TR/css3-fonts/#descdef-src
-font_face_url_src:
-    url kFormatFunctionToken maybe_whitespace kStringToken maybe_whitespace ')'
-        maybe_whitespace {
-    $$ = AddRef(new cssom::UrlSrcValue(MakeScopedRefPtrAndRelease($1),
-                                       $4.ToString()));
-  }
-  | url {
-    $$ = AddRef(new cssom::UrlSrcValue(MakeScopedRefPtrAndRelease($1), ""));
-  }
-  ;
-
-// The syntax for a local font-face reference is a unique font face name
-// enclosed by "local(" and ")".
-//   https://www.w3.org/TR/css3-fonts/#descdef-src
-font_face_local_src:
-    kLocalFunctionToken maybe_whitespace font_family_specific_name ')'
-        maybe_whitespace {
-    $$ = AddRef(new cssom::LocalSrcValue($3->value()));
-    $3->Release();
-  }
-  ;
-
-font_face_src_list_element:
-    font_face_url_src
-  | font_face_local_src
-  ;
-
-comma_separated_font_face_src_list:
-    font_face_src_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_font_face_src_list comma font_face_src_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-// The src descriptor specifies the resource containing font data. Its value is
-// a prioritized, comma-separated list of external references or
-// locally-installed font face names.
-//   https://www.w3.org/TR/css3-fonts/#src-desc
-font_face_src_property_value:
-    comma_separated_font_face_src_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  | common_values
-  ;
-
-// The unquoted name must be a sequence of identifiers separated by whitespace
-// which is converted to a string by joining the identifiers together separated
-// by a single space.
-//   https://www.w3.org/TR/css3-fonts/#descdef-src
-font_family_name_identifier_list:
-    identifier_token maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1.ToString()));
-  }
-  | font_family_name_identifier_list identifier_token maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1->value() + " " + $2.ToString()));
-    $1->Release();
-  }
-  ;
-
-font_family_string_name:
-    kStringToken maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1.ToString()));
-  }
-  ;
-
-// Font family names other than generic families must be quoted
-// as strings or unquoted as a sequence of one or more identifiers.
-//   https://www.w3.org/TR/css3-fonts/#family-name-value
-font_family_specific_name:
-    font_family_name_identifier_list
-  | font_family_string_name
-  ;
-
-// Specific font name that does not accept a single identifier. This is needed
-// in certain cases to avoid ambiguous states, since single identifier names
-// require special rules for keywords.
-font_family_specific_name_no_single_identifier:
-    font_family_name_identifier_list identifier_token maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1->value() + " " + $2.ToString()));
-    $1->Release();
-  }
-  | font_family_string_name
-  ;
-
-// There are two types of font family names:
-//   -- The name of a specific font family
-//   -- A generic font family which can be used as a general fallback mechanism
-//   https://www.w3.org/TR/css3-fonts/#family-name-value
-font_family_name:
-    identifier_token maybe_whitespace {
-    // Generic families are defined in all CSS implementations.
-    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
-    if ($1 == cssom::kCursiveKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetCursive().get());
-    } else if ($1 == cssom::kFantasyKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetFantasy().get());
-    } else if ($1 == cssom::kMonospaceKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetMonospace().get());
-    } else if ($1 == cssom::kSansSerifKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetSansSerif().get());
-    } else if ($1 == cssom::kSerifKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetSerif().get());
-    } else {
-      $$ = AddRef(new cssom::StringValue($1.ToString()));
-    }
-  }
-  | font_family_specific_name_no_single_identifier { $$ = $1; }
-  ;
-
-comma_separated_font_family_name_list:
-    font_family_name {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_font_family_name_list comma font_family_name {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-// Prioritized list of font family names.
-//   https://www.w3.org/TR/css3-fonts/#font-family-prop
-font_family_property_value:
-  // Special case for a single identifier, which can be a reserved keyword or
-  // a generic font name.
-    identifier_token maybe_whitespace {
-    // "inherit" and "initial" are reserved values and not allowed as font
-    // family names.
-    //   https://www.w3.org/TR/css3-fonts/#propdef-font-family
-    if ($1 == cssom::kInheritKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetInherit().get());
-    } else if ($1 == cssom::kInitialKeywordName) {
-      $$ = AddRef(cssom::KeywordValue::GetInitial().get());
-    } else {
-      scoped_ptr<cssom::PropertyListValue::Builder>
-          builder(new cssom::PropertyListValue::Builder());
-
-      // Generic families are defined in all CSS implementations.
-      //   https://www.w3.org/TR/css3-fonts/#generic-font-families
-      if ($1 == cssom::kCursiveKeywordName) {
-        builder->push_back(cssom::KeywordValue::GetCursive().get());
-      } else if ($1 == cssom::kFantasyKeywordName) {
-        builder->push_back(cssom::KeywordValue::GetFantasy().get());
-      } else if ($1 == cssom::kMonospaceKeywordName) {
-        builder->push_back(cssom::KeywordValue::GetMonospace().get());
-      } else if ($1 == cssom::kSansSerifKeywordName) {
-        builder->push_back(cssom::KeywordValue::GetSansSerif().get());
-      } else if ($1 == cssom::kSerifKeywordName) {
-        builder->push_back(cssom::KeywordValue::GetSerif().get());
-      } else {
-        builder->push_back(new cssom::StringValue($1.ToString()));
-      }
-
-      $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-    }
-  }
-  | font_family_specific_name_no_single_identifier {
-    scoped_ptr<cssom::PropertyListValue::Builder>
-        builder(new cssom::PropertyListValue::Builder());
-    builder->push_back(MakeScopedRefPtrAndRelease($1));
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  | comma_separated_font_family_name_list comma font_family_name {
-    scoped_ptr<cssom::PropertyListValue::Builder> builder($1);
-    builder->push_back(MakeScopedRefPtrAndRelease($3));
-    $$ = AddRef(new cssom::PropertyListValue(builder.Pass()));
-  }
-  | errors {
-    parser_impl->LogError(@1, "unsupported property value for font-family");
-    $$ = NULL;
-  }
-  ;
-
-// Desired height of glyphs from the font.
-//   https://www.w3.org/TR/css3-fonts/#font-size-prop
-font_size_property_value:
-    positive_length_percent_property_value
-  | common_values
-  ;
-
-// All acceptable 'font-style' property values, excluding 'normal', 'inherit'
-// and 'initial'.
-font_style_exclusive_property_value:
-    kItalicToken maybe_whitespace {
-    $$ = AddRef(cssom::FontStyleValue::GetItalic().get());
-  }
-  | kObliqueToken maybe_whitespace {
-    $$ = AddRef(cssom::FontStyleValue::GetOblique().get());
-  }
-  ;
-
-// The 'font-style' property allows italic or oblique faces to be selected.
-//   https://www.w3.org/TR/css3-fonts/#font-style-prop
-font_style_property_value:
-    font_style_exclusive_property_value
-  | kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::FontStyleValue::GetNormal().get());
-  }
-  | common_values
-  ;
-
-// All acceptable 'font-weight' property values, excluding 'normal', 'inherit'
-// and 'initial'.
-font_weight_exclusive_property_value:
-    kBoldToken maybe_whitespace {
-    $$ = AddRef(cssom::FontWeightValue::GetBoldAka700().get());
-  }
-  | positive_integer {
-    switch ($1) {
-      case 100:
-        $$ = AddRef(cssom::FontWeightValue::GetThinAka100().get());
-        break;
-      case 200:
-        $$ = AddRef(cssom::FontWeightValue::GetExtraLightAka200().get());
-        break;
-      case 300:
-        $$ = AddRef(cssom::FontWeightValue::GetLightAka300().get());
-        break;
-      case 400:
-        $$ = AddRef(cssom::FontWeightValue::GetNormalAka400().get());
-        break;
-      case 500:
-        $$ = AddRef(cssom::FontWeightValue::GetMediumAka500().get());
-        break;
-      case 600:
-        $$ = AddRef(cssom::FontWeightValue::GetSemiBoldAka600().get());
-        break;
-      case 700:
-        $$ = AddRef(cssom::FontWeightValue::GetBoldAka700().get());
-        break;
-      case 800:
-        $$ = AddRef(cssom::FontWeightValue::GetExtraBoldAka800().get());
-        break;
-      case 900:
-        $$ = AddRef(cssom::FontWeightValue::GetBlackAka900().get());
-        break;
-      default:
-        parser_impl->LogError(@1, "unsupported property value for font-weight");
-        $$ = NULL;
-    }
-  }
-  ;
-
-// The weight of glyphs in the font, their degree of blackness
-// or stroke thickness.
-//   https://www.w3.org/TR/css3-fonts/#font-weight-prop
-font_weight_property_value:
-    font_weight_exclusive_property_value
-  | kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::FontWeightValue::GetNormalAka400().get());
-  }
-  | common_values
-  ;
-
-// Optional font element represents a single optional font shorthand value.
-// It uses $0 to access its parent's FontShorthand object and build it, so it
-// should always be used to the right of an optional_font_value_list. Note that
-// outside of being set via the second normal token, font weight, while
-// optional, is handled separately. This is due to Bison having parsing
-// conflicts with differentiating a number (which is an allowable font weight
-// value) followed by a token as either two optional font elements or the font
-// size followed by the font family. As a result, the recommended ordering is
-// required and font weight must come after font style.
-optional_font_element:
-    font_style_exclusive_property_value {
-    if (!$<font>0->font_style) {
-      $<font>0->font_style = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "font-style value declared twice in font.");
-    }
-  }
-  | kNormalToken maybe_whitespace {
-    // The normal token is treated as representing font style if it is
-    // encountered before the style is set. Otherwise, it is treated as the
-    // font weight.
-    if (!$<font>0->font_style) {
-      $<font>0->font_style =
-        AddRef(cssom::FontStyleValue::GetNormal().get());
-    } else if (!$<font>0->font_weight) {
-      $<font>0->font_weight =
-        AddRef(cssom::FontWeightValue::GetNormalAka400().get());
-    } else {
-      parser_impl->LogWarning(
-        @1, "too many font values declared in font.");
-    }
-  }
-  | error maybe_whitespace {
-    parser_impl->LogError(@1, "unsupported property value for font");
-    $<font>0->error = true;
-  }
-  ;
-
-optional_font_value_list:
-    /* empty */ {
-    // Initialize the result, to be filled in by
-    // non_empty_optional_font_value_list
-    $$ = new FontShorthand();
-  }
-  | non_empty_optional_font_value_list
-  ;
-
-non_empty_optional_font_value_list:
-    optional_font_value_list optional_font_element {
-    // Propagate the list from our parent.
-    // optional_font_element will have already taken care of adding itself
-    // to the list via $0.
-    $$ = $1;
-  }
-  ;
-
-// Font shorthand property.
-//   https://www.w3.org/TR/css3-fonts/#font-prop
-font_property_value:
-    optional_font_value_list positive_length_percent_property_value
-        comma_separated_font_family_name_list {
-    // Font shorthand properties without a non-normal weight value.
-    scoped_ptr<FontShorthand> font($1);
-
-    font->font_size = MakeScopedRefPtrAndRelease($2);
-
-    scoped_ptr<cssom::PropertyListValue::Builder> builder($3);
-    font->font_family = new cssom::PropertyListValue(builder.Pass());
-
-    $$ = font.release();
-  }
-  | optional_font_value_list font_weight_exclusive_property_value
-        positive_length_percent_property_value
-        comma_separated_font_family_name_list {
-    // Font shorthand properties with a non-normal weight value. This and the
-    // preceding without expression are not simply combined into a single
-    // maybe_font_weight_exclusive_property_value as a result of Bison having
-    // parsing conflicts when the weight value appears in that form.
-    scoped_ptr<FontShorthand> font($1);
-
-    if (!font->font_weight) {
-      font->font_weight = MakeScopedRefPtrAndRelease($2);
-    } else {
-      parser_impl->LogWarning(
-          @1, "font-weight value declared twice in font.");
-    }
-
-    font->font_size = MakeScopedRefPtrAndRelease($3);
-
-    scoped_ptr<cssom::PropertyListValue::Builder> builder($4);
-    font->font_family = new cssom::PropertyListValue(builder.Pass());
-
-    $$ = font.release();
-  }
-  | common_values_without_errors {
-    // Replicate the common value into each of the properties that font
-    // is a shorthand for.
-    scoped_ptr<FontShorthand> font(new FontShorthand());
-    font->font_style = $1;
-    font->font_weight = $1;
-    font->font_size = $1;
-    font->font_family = $1;
-    $1->Release();
-
-    $$ = font.release();
-  }
-  ;
-
-// Specifies the content height of boxes.
-//   https://www.w3.org/TR/CSS21/visudet.html#the-height-property
-height_property_value:
-    positive_length_percent_property_value
-  | auto
-  | common_values
-  ;
-
-// Specifies the minimum content height of boxes.
-//   https://www.w3.org/TR/CSS21/visudet.html#propdef-min-height
-min_height_property_value:
-    positive_length_percent_property_value
-  | common_values
-  ;
-
-// Specifies the maximum content height of boxes.
-//   https://www.w3.org/TR/CSS2/visudet.html#propdef-max-height
-max_height_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | positive_length_percent_property_value
-  | common_values
-  ;
-
-
-// Specifies the minimal height of line boxes within the element.
-//   https://www.w3.org/TR/CSS21/visudet.html#line-height
-line_height_property_value:
-    kNormalToken maybe_whitespace  {
-    $$ = AddRef(cssom::KeywordValue::GetNormal().get());
-  }
-  | non_negative_number {
-    $$ = AddRef(new cssom::NumberValue($1));
-  }
-  | absolute_or_relative_length {
-    $$ = $1;
-  }
-  | positive_percentage {
-    $$ = $1;
-  }
-  | common_values
-  ;
-
-// <margin-width> value type.
-//   https://www.w3.org/TR/CSS21/box.html#value-def-margin-width
-margin_width:
-    length_percent_property_value
-  | auto
-  ;
-
-// Specifies the width of a top, right, bottom, or left side of the margin area
-// of a box.
-//   https://www.w3.org/TR/CSS21/box.html#margin-properties
-margin_side_property_value:
-    margin_width
-  | common_values
-  ;
-
-// The "margin" property is a shorthand property for setting "margin-top",
-// "margin-right", "margin-bottom", and "margin-left" at the same place.
-//   https://www.w3.org/TR/CSS21/box.html#margin-properties
-margin_property_value:
-    // If there is only one component value, it applies to all sides.
-    margin_width {
-    scoped_refptr<cssom::PropertyValue> width(MakeScopedRefPtrAndRelease($1));
-    $$ = MarginOrPaddingShorthand::TryCreate(
-        width, width, width, width).release();
-  }
-    // If there are two values, the top and bottom margins are set to the first
-    // value and the right and left margins are set to the second.
-  | margin_width margin_width {
-    scoped_refptr<cssom::PropertyValue> vertical_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> horizontal_width =
-        MakeScopedRefPtrAndRelease($2);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             vertical_width, horizontal_width,
-             vertical_width, horizontal_width).release();
-  }
-    // If there are three values, the top is set to the first value, the left
-    // and right are set to the second, and the bottom is set to the third.
-  | margin_width margin_width margin_width {
-    scoped_refptr<cssom::PropertyValue> top_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> horizontal_width =
-        MakeScopedRefPtrAndRelease($2);
-    scoped_refptr<cssom::PropertyValue> bottom_width =
-        MakeScopedRefPtrAndRelease($3);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             top_width, horizontal_width,
-             bottom_width, horizontal_width).release();
-  }
-    // If there are four values, they apply to the top, right, bottom, and left,
-    // respectively.
-  | margin_width margin_width margin_width margin_width {
-    scoped_refptr<cssom::PropertyValue> top_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> left_width =
-        MakeScopedRefPtrAndRelease($2);
-    scoped_refptr<cssom::PropertyValue> bottom_width =
-        MakeScopedRefPtrAndRelease($3);
-    scoped_refptr<cssom::PropertyValue> right_width =
-        MakeScopedRefPtrAndRelease($4);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             top_width, left_width, bottom_width, right_width).release();
-  }
-  | common_values {
-    $$ = MarginOrPaddingShorthand::TryCreate($1, $1, $1, $1).release();
-  }
-  ;
-
-// Specifies top, right, bottom, or left offset of the box relatively
-// to the container block.
-//   https://www.w3.org/TR/CSS21/visuren.html#position-props
-offset_property_value:
-    length_percent_property_value
-  | auto
-  | common_values
-  ;
-
-// Specifies how to blend the element (including its descendants)
-// into the current composite rendering.
-//   https://www.w3.org/TR/css3-color/#transparency
-opacity_property_value:
-    alpha { $$ = AddRef(new cssom::NumberValue($1)); }
-  | common_values
-  ;
-
-// Specifies whether content of a block container element is clipped when it
-// overflows the element's box.
-//   https://www.w3.org/TR/CSS2/visufx.html#overflow
-overflow_property_value:
-    kHiddenToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetHidden().get());
-  }
-  | kVisibleToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetVisible().get());
-  }
-  | common_values
-  ;
-
-// Specifies whether the user agent may arbitrarily break within a word to
-// prevent overflow when an otherwise unbreakable string is too long to
-// fit within the line box.
-//   https://www.w3.org/TR/css-text-3/#overflow-wrap-property
-overflow_wrap_property_value:
-    kBreakWordToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBreakWord().get());
-  }
-  | kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNormal().get());
-  }
-  | common_values
-  ;
-
-// <padding-width> value type is the same as
-// positive_length_percent_property_value.
-//   https://www.w3.org/TR/CSS21/box.html#value-def-padding-width
-// Specifies the width of a top, right, bottom, or left side of the padding area
-// of a box.
-//   https://www.w3.org/TR/CSS21/box.html#padding-properties
-padding_side_property_value:
-    positive_length_percent_property_value
-  | common_values
-  ;
-
-// The "padding" property is a shorthand property for setting "padding-top",
-// "padding-right", "padding-bottom", and "padding-left" at the same place.
-//   https://www.w3.org/TR/CSS21/box.html#padding-properties
-padding_property_value:
-    // If there is only one component value, it applies to all sides.
-    positive_length_percent_property_value {
-    scoped_refptr<cssom::PropertyValue> width =
-        MakeScopedRefPtrAndRelease($1);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             width, width, width, width).release();
-  }
-    // If there are two values, the top and bottom paddings are set to the first
-    // value and the right and left paddings are set to the second.
-  | positive_length_percent_property_value
-    positive_length_percent_property_value {
-    scoped_refptr<cssom::PropertyValue> vertical_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> horizontal_width =
-        MakeScopedRefPtrAndRelease($2);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             vertical_width, horizontal_width,
-             vertical_width, horizontal_width).release();
-  }
-    // If there are three values, the top is set to the first value, the left
-    // and right are set to the second, and the bottom is set to the third.
-  | positive_length_percent_property_value
-    positive_length_percent_property_value
-    positive_length_percent_property_value {
-    scoped_refptr<cssom::PropertyValue> top_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> horizontal_width =
-        MakeScopedRefPtrAndRelease($2);
-    scoped_refptr<cssom::PropertyValue> bottom_width =
-        MakeScopedRefPtrAndRelease($3);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             top_width, horizontal_width,
-             bottom_width, horizontal_width).release();
-  }
-    // If there are four values, they apply to the top, right, bottom, and left,
-    // respectively.
-  | positive_length_percent_property_value
-    positive_length_percent_property_value
-    positive_length_percent_property_value
-    positive_length_percent_property_value {
-    scoped_refptr<cssom::PropertyValue> top_width =
-        MakeScopedRefPtrAndRelease($1);
-    scoped_refptr<cssom::PropertyValue> left_width =
-        MakeScopedRefPtrAndRelease($2);
-    scoped_refptr<cssom::PropertyValue> bottom_width =
-        MakeScopedRefPtrAndRelease($3);
-    scoped_refptr<cssom::PropertyValue> right_width =
-        MakeScopedRefPtrAndRelease($4);
-    $$ = MarginOrPaddingShorthand::TryCreate(
-             top_width, left_width, bottom_width, right_width).release();
-  }
-  | common_values {
-    $$ = MarginOrPaddingShorthand::TryCreate($1, $1, $1, $1).release();
-  }
-  ;
-
-// Used to control designation of elements by pointers.
-// While only defined in the SVG spec, the pointer-events property has been
-// proposed an commonly implemented to also apply to HTML elements for
-// values of 'none' (element can not be indicated by a pointer) and 'auto'
-// (element can be indicated by a pointer if the element has 'visibility' set
-// to 'visible').
-//   https://www.w3.org/TR/SVG11/interact.html#PointerEventsProperty
-pointer_events_property_value:
-    kAutoToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetAuto().get());
-  }
-  | kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | common_values
-  ;
-
-// Determines which of the positioning algorithms is used to calculate
-// the position of a box.
-//   https://www.w3.org/TR/CSS21/visuren.html#choose-position
-position_property_value:
-    kAbsoluteToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetAbsolute().get());
-  }
-  | kFixedToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetFixed().get());
-  }
-  | kRelativeToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetRelative().get());
-  }
-  | kStaticToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetStatic().get());
-  }
-  | common_values
-  ;
-
-// If the second parameter is not provided, it takes a value equal to the first.
-//   https://www.w3.org/TR/css3-transforms/#funcdef-scale
-scale_function_parameters:
-    number {
-    $$ = new cssom::ScaleFunction($1, $1);
-  }
-  | number comma number {
-    $$ = new cssom::ScaleFunction($1, $3);
-  }
-  ;
-
-// This property describes how inline-level content of a block container is
-// aligned.
-//   https://www.w3.org/TR/css-text-3/#text-align
-text_align_property_value:
-    kEndToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetEnd().get());
-  }
-  | kLeftToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetLeft().get());
-  }
-  | kCenterToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetCenter().get());
-  }
-  | kRightToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetRight().get());
-  }
-  | kStartToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetStart().get());
-  }
-  | common_values
-  ;
-
-// This property specifies what line decorations.
-//   https://www.w3.org/TR/css-text-decor-3/#text-decoration-line
-text_decoration_line_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kLineThroughToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetLineThrough().get());
-  }
-  | common_values
-  ;
-
-// Text decoration is a shorthand for setting 'text-decoration-line',
-// 'text-decoration-color', and 'text-decoration-style' in one declaration.
-// TODO: Redirect text decoration to text decoration line for now and
-// change it when fully implement text decoration.
-//   https://www.w3.org/TR/css-text-decor-3/#text-decoration
-text_decoration_property_value: text_decoration_line_property_value;
-
-// This property specifies the indentation applied to lines of inline content in
-// a block.
-//   https://www.w3.org/TR/css-text-3/#text-indent
-text_indent_property_value:
-    length {
-    $$ = $1;
-  }
-  | common_values
-  ;
-
-// This property specifies rendering when inline content overflows its line box
-// edge in the inline progression direction of its block container element.
-//   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
-text_overflow_property_value:
-    kClipToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetClip().get());
-  }
-  | kEllipsisToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetEllipsis().get());
-  }
-  | common_values
-  ;
-
-text_shadow_property_element:
-    length {
-    if ($<shadow_info>0->length_vector.size() == 2) {
-      scoped_refptr<cssom::LengthValue> length(MakeScopedRefPtrAndRelease($1));
-      // Negative values are not allowed for blur radius.
-      if (length && length->value() < 0) {
-        parser_impl->LogError(@1, "negative values of blur radius are illegal");
-        $<shadow_info>0->error = true;
-      }
-      $<shadow_info>0->length_vector.push_back(length);
-    } else {
-      $<shadow_info>0->length_vector.push_back(
-          MakeScopedRefPtrAndRelease($1));
-    }
-  }
-  | color {
-    scoped_refptr<cssom::RGBAColorValue> color(MakeScopedRefPtrAndRelease($1));
-    if (!$<shadow_info>0->color) {
-      $<shadow_info>0->color = color;
-    } else {
-      parser_impl->LogError(
-          @1, "color value declared twice in text shadow.");
-      $<shadow_info>0->error = true;
-    }
-  }
-  ;
-
-text_shadow_list:
-    /* empty */ {
-    $$ = new ShadowPropertyInfo();
-  }
-  | text_shadow_list text_shadow_property_element {
-    $$ = $1;
-  }
-  ;
-
-validated_text_shadow_list:
-    text_shadow_list {
-    scoped_ptr<ShadowPropertyInfo> shadow_property_info($1);
-    if (!shadow_property_info->IsShadowPropertyValid(kTextShadow)) {
-      parser_impl->LogWarning(@1, "invalid text shadow property.");
-      $$ = NULL;
-    } else {
-      $$ = AddRef(new cssom::ShadowValue(
-              shadow_property_info->length_vector, shadow_property_info->color,
-              false));
-    }
-  }
-  ;
-
-comma_separated_text_shadow_list:
-    validated_text_shadow_list {
-    if ($1) {
-      $$ = new cssom::PropertyListValue::Builder();
-      $$->push_back(MakeScopedRefPtrAndRelease($1));
-    }
-  }
-  | comma_separated_text_shadow_list comma validated_text_shadow_list {
-    $$ = $1;
-    if ($$ && $3) {
-      $$->push_back(MakeScopedRefPtrAndRelease($3));
-    }
-  }
-  ;
-
-// This property accepts a comma-separated list of shadow effects to be applied
-// to the text of the element.
-//   https://www.w3.org/TR/css-text-decor-3/#text-shadow-property
-text_shadow_property_value:
-    comma_separated_text_shadow_list {
-    if ($1) {
-      scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    }
-  }
-  | kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | common_values
-  ;
-
-// This property controls capitalization effects of an element's text.
-//   https://www.w3.org/TR/css3-text/#text-transform-property
-text_transform_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kUppercaseToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetUppercase().get());
-  }
-  | common_values
-  ;
-
-// The set of allowed transform functions.
-//   https://www.w3.org/TR/css3-transforms/#transform-functions
-transform_function:
-  // Specifies an arbitrary affine 2D transformation.
-    kMatrixFunctionToken maybe_whitespace number comma number comma number
-      comma number comma number comma number ')' maybe_whitespace {
-    $<transform_functions>0->push_back(
-        new cssom::MatrixFunction($3, $5, $7, $9, $11, $13));
-  }
-  // Specifies a 2D rotation around the z-axis.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-rotate
-  | kRotateFunctionToken maybe_whitespace angle ')'
-      maybe_whitespace {
-    $<transform_functions>0->push_back(new cssom::RotateFunction($3));
-  }
-  // Specifies a 2D scale operation by the scaling vector.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-scale
-  | kScaleFunctionToken maybe_whitespace scale_function_parameters ')'
-      maybe_whitespace {
-    $<transform_functions>0->push_back($3);
-  }
-  // Specifies a 2D scale operation using the [sx, 1] scaling vector, where sx
-  // is given as the parameter.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-scalex
-  | kScaleXFunctionToken maybe_whitespace number ')'
-      maybe_whitespace {
-    $<transform_functions>0->push_back(new cssom::ScaleFunction($3, 1.0f));
-  }
-  // Specifies a 2D scale operation using the [1, sy] scaling vector, where sy
-  // is given as the parameter.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-scaley
-  | kScaleYFunctionToken maybe_whitespace number ')'
-      maybe_whitespace {
-    $<transform_functions>0->push_back(new cssom::ScaleFunction(1.0f, $3));
-  }
-  // Specifies a 2D translation by the vector [tx, ty], where tx is the first
-  // translation-value parameter and ty is the optional second translation-value
-  // parameter. If <ty> is not provided, ty has zero as a value.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-translate
-  | kTranslateFunctionToken maybe_whitespace length_percent_property_value ')'
-      maybe_whitespace {
-    if ($3) {
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kXAxis, MakeScopedRefPtrAndRelease($3)));
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kYAxis,
-          scoped_refptr<cssom::LengthValue>(
-              new cssom::LengthValue(0, cssom::kPixelsUnit))));
-    }
-  }
-  | kTranslateFunctionToken maybe_whitespace length_percent_property_value comma
-    length_percent_property_value ')' maybe_whitespace {
-    if ($3 && $5) {
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kXAxis, MakeScopedRefPtrAndRelease($3)));
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kYAxis, MakeScopedRefPtrAndRelease($5)));
-    }
-  }
-  // Specifies a translation by the given amount in the X direction.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-translatex
-  | kTranslateXFunctionToken maybe_whitespace length_percent_property_value ')'
-      maybe_whitespace {
-    if ($3) {
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kXAxis, MakeScopedRefPtrAndRelease($3)));
-    }
-  }
-  // Specifies a translation by the given amount in the Y direction.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-translatey
-  | kTranslateYFunctionToken maybe_whitespace length_percent_property_value ')'
-      maybe_whitespace {
-    if ($3) {
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kYAxis, MakeScopedRefPtrAndRelease($3)));
-    }
-  }
-  // Specifies a 3D translation by the vector [0,0,z] with the given amount
-  // in the Z direction.
-  //   https://www.w3.org/TR/css3-transforms/#funcdef-translatez
-  | kTranslateZFunctionToken maybe_whitespace length ')'
-      maybe_whitespace {
-    if ($3) {
-      $<transform_functions>0->push_back(new cssom::TranslateFunction(
-          cssom::TranslateFunction::kZAxis, MakeScopedRefPtrAndRelease($3)));
-    }
-  }
-  ;
-
-// One or more transform functions separated by whitespace.
-//   https://www.w3.org/TR/css3-transforms/#typedef-transform-list
-transform_list:
-    /* empty */ {
-    $$ = new cssom::TransformFunctionListValue::Builder();
-  }
-  | transform_list transform_function {
-    $$ = $1;
-  }
-  ;
-
-// A transformation that is applied to the coordinate system an element
-// renders in.
-//   https://www.w3.org/TR/css3-transforms/#transform-property
-transform_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | transform_list {
-    scoped_ptr<cssom::TransformFunctionListValue::Builder>
-        transform_functions($1);
-    $$ = transform_functions->size() == 0u ? NULL :
-            AddRef(new cssom::TransformFunctionListValue(
-                transform_functions->Pass()));
-  }
-  | transform_list errors {
-    scoped_ptr<cssom::TransformFunctionListValue::Builder>
-        transform_functions($1);
-    parser_impl->LogWarning(@2, "invalid transform function");
-    $$ = NULL;
-  }
-  | common_values_without_errors
-  ;
-
-validated_two_position_list_elements:
-    position_list_element position_list_element {
-    scoped_ptr<PositionParseStructure> position_info(
-        new PositionParseStructure());
-    position_info->PushBackElement(MakeScopedRefPtrAndRelease($1));
-    if (position_info->PushBackElement(MakeScopedRefPtrAndRelease($2)) &&
-        position_info->IsPositionValidOnSizeTwo()) {
-      $$ = new cssom::PropertyListValue::Builder(
-              position_info->position_builder());
-    } else {
-      parser_impl->LogWarning(@2, "invalid transform-origin value");
-      $$ = NULL;
-    }
-  }
-  ;
-
-// The transform-origin property lets you modify the origin for transformations
-// of an element.
-//   https://www.w3.org/TR/css3-transforms/#propdef-transform-origin
-transform_origin_property_value:
-    position_list_element {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value(
-        new cssom::PropertyListValue::Builder());
-    property_value->push_back(MakeScopedRefPtrAndRelease($1));
-    $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-  }
-  | validated_two_position_list_elements {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  | validated_two_position_list_elements length {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    if (property_value) {
-      property_value->push_back(MakeScopedRefPtrAndRelease($2));
-      $$ = AddRef(new cssom::PropertyListValue(property_value.Pass()));
-    } else {
-      $$ = NULL;
-    }
-  }
-  | common_values
-  ;
-
-// Determines the vertical alignment of a box.
-//   https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
-vertical_align_property_value:
-    kBottomToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBottom().get());
-  }
-  | kTopToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetTop().get());
-  }
-  | kMiddleToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetMiddle().get());
-  }
-  | kBaselineToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBaseline().get());
-  }
-  | common_values
-  ;
-
-// The 'visibility' property specifies whether the boxes generated by an element
-// are rendered.
-//   https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
-visibility_property_value:
-    kHiddenToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetHidden().get());
-  }
-  | kVisibleToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetVisible().get());
-  }
-  | common_values
-  ;
-
-// One ore more time values separated by commas.
-comma_separated_time_list:
-    time {
-    $$ = new cssom::TimeListValue::Builder();
-    $$->push_back(base::TimeDelta::FromInternalValue($1));
-  }
-  | comma_separated_time_list comma time {
-    $$ = $1;
-    $$->push_back(base::TimeDelta::FromInternalValue($3));
-  }
-  ;
-
-time_list_property_value:
-    comma_separated_time_list {
-    scoped_ptr<cssom::ListValue<base::TimeDelta>::Builder> time_list($1);
-    $$ = time_list
-         ? AddRef(new cssom::TimeListValue(time_list.Pass()))
-         : NULL;
-  }
-  | common_values
-  ;
-
-
-maybe_steps_start_or_end_parameter:
-    /* empty */ {
-    // Default value is 'end'.
-    $$ = cssom::SteppingTimingFunction::kEnd;
-  }
-  | comma kStartToken maybe_whitespace {
-    $$ = cssom::SteppingTimingFunction::kStart;
-  }
-  | comma kEndToken maybe_whitespace {
-    $$ = cssom::SteppingTimingFunction::kEnd;
-  }
-  ;
-
-single_timing_function:
-    kCubicBezierFunctionToken maybe_whitespace
-    number comma number comma number comma number ')' {
-    float p1_x = $3;
-    float p1_y = $5;
-    float p2_x = $7;
-    float p2_y = $9;
-
-    if (p1_x < 0 || p1_x > 1 || p2_x < 0 || p2_x > 1) {
-      parser_impl->LogError(
-          @1,
-          "cubic-bezier control point x values must be in the range [0, 1].");
-      // In the case of an error, return the ease function as a default.
-      $$ = AddRef(cssom::TimingFunction::GetEase().get());
-    } else {
-      $$ = AddRef(new cssom::CubicBezierTimingFunction(p1_x, p1_y, p2_x, p2_y));
-    }
-  }
-  | kStepsFunctionToken maybe_whitespace kIntegerToken maybe_whitespace
-    maybe_steps_start_or_end_parameter ')' {
-    int number_of_steps = $3;
-    if (number_of_steps <= 0) {
-      parser_impl->LogError(
-          @1,
-          "The steps() number of steps parameter must be greater than 0.");
-      number_of_steps = 1;
-    }
-    $$ = AddRef(new cssom::SteppingTimingFunction(number_of_steps, $5));
-  }
-  | kEaseInOutToken {
-    $$ = AddRef(cssom::TimingFunction::GetEaseInOut().get());
-  }
-  | kEaseInToken {
-    $$ = AddRef(cssom::TimingFunction::GetEaseIn().get());
-  }
-  | kEaseOutToken {
-    $$ = AddRef(cssom::TimingFunction::GetEaseOut().get());
-  }
-  | kEaseToken {
-    $$ = AddRef(cssom::TimingFunction::GetEase().get());
-  }
-  | kLinearToken {
-    $$ = AddRef(cssom::TimingFunction::GetLinear().get());
-  }
-  | kStepEndToken {
-    $$ = AddRef(cssom::TimingFunction::GetStepEnd().get());
-  }
-  | kStepStartToken {
-    $$ = AddRef(cssom::TimingFunction::GetStepStart().get());
-  }
-  ;
-
-comma_separated_single_timing_function_list:
-    single_timing_function {
-    $$ = new cssom::TimingFunctionListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_single_timing_function_list comma
-    single_timing_function {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-timing_function_list_property_value:
-    comma_separated_single_timing_function_list {
-    scoped_ptr<cssom::TimingFunctionListValue::Builder>
-        timing_function_list($1);
-    $$ = timing_function_list
-         ? AddRef(new cssom::TimingFunctionListValue(
-               timing_function_list.Pass()))
-         : NULL;
-  }
-  | common_values
-  ;
-
-// The 'animation-delay' property defines when the animation will start.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-delay-property
-animation_delay_property_value: time_list_property_value;
-
-// The 'animation-direction' property defines which direction time should flow
-// given the current iteration number.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-direction-property
-animation_direction_list_element:
-    kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNormal().get());
-  }
-  | kReverseToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetReverse().get());
-  }
-  | kAlternateToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetAlternate().get());
-  }
-  | kAlternateReverseToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetAlternateReverse().get());
-  }
-  ;
-
-comma_separated_animation_direction_list:
-    animation_direction_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_animation_direction_list comma
-        animation_direction_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-animation_direction_property_value:
-    comma_separated_animation_direction_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> direction_list($1);
-    $$ = direction_list
-         ? AddRef(new cssom::PropertyListValue(direction_list.Pass()))
-         : NULL;
-  }
-  | common_values_without_errors
-  | errors {
-    parser_impl->LogError(
-        @1, "unsupported property value for animation-direction");
-    $$ = NULL;
-  }
-  ;
-
-// The 'animation-duration' property defines the length of time that an
-// animation takes to complete one cycle.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-duration-property
-animation_duration_property_value: time_list_property_value;
-
-// The 'animation-fill-mode' property defines what values are applied by the
-// animation outside the time it is executing.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-fill-mode-property
-animation_fill_mode_list_element:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kForwardsToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetForwards().get());
-  }
-  | kBackwardsToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBackwards().get());
-  }
-  | kBothToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetBoth().get());
-  }
-  ;
-
-comma_separated_animation_fill_mode_list:
-    animation_fill_mode_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_animation_fill_mode_list comma
-        animation_fill_mode_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-animation_fill_mode_property_value:
-    comma_separated_animation_fill_mode_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> fill_mode_list($1);
-    $$ = fill_mode_list
-         ? AddRef(new cssom::PropertyListValue(fill_mode_list.Pass()))
-         : NULL;
-  }
-  | common_values_without_errors
-  | errors {
-    parser_impl->LogError(
-        @1, "unsupported property value for animation-fill-mode");
-    $$ = NULL;
-  }
-  ;
-
-// The 'animation-iteration-count' property specifies the number of times an
-// animation cycle is played.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-iteration-count-property
-animation_iteration_count_list_element:
-    kInfiniteToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetInfinite().get());
-  }
-  | non_negative_number {
-    $$ = AddRef(new cssom::NumberValue($1));
-  }
-  ;
-
-comma_separated_animation_iteration_count_list:
-    animation_iteration_count_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_animation_iteration_count_list comma
-        animation_iteration_count_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-animation_iteration_count_property_value:
-    comma_separated_animation_iteration_count_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> iteration_count_list($1);
-    $$ = iteration_count_list
-         ? AddRef(new cssom::PropertyListValue(iteration_count_list.Pass()))
-         : NULL;
-  }
-  | common_values_without_errors
-  | errors {
-    parser_impl->LogError(
-        @1, "unsupported property value for animation-iteration-count");
-    $$ = NULL;
-  }
-  ;
-
-// The 'animation-name' property defines a list of animations that apply.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-name-property
-animation_name_list_element:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | kIdentifierToken maybe_whitespace {
-    $$ = AddRef(new cssom::StringValue($1.ToString()));
-  }
-  ;
-
-comma_separated_animation_name_list:
-    animation_name_list_element {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(MakeScopedRefPtrAndRelease($1));
-  }
-  | comma_separated_animation_name_list comma
-        animation_name_list_element {
-    $$ = $1;
-    $$->push_back(MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-animation_name_property_value:
-    comma_separated_animation_name_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> name_list($1);
-    $$ = name_list
-         ? AddRef(new cssom::PropertyListValue(name_list.Pass()))
-         : NULL;
-  }
-  | common_values_without_errors
-  | errors {
-    parser_impl->LogError(
-        @1, "unsupported property value for animation-name");
-    $$ = NULL;
-  }
-  ;
-
-// The 'animation-timing-function' property describes how the animation will
-// progress over one cycle of its duration.
-//  https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-timing-function-property
-animation_timing_function_property_value: timing_function_list_property_value;
-
-// single_animation_element represents a component of a single animation.
-// It uses $0 to access its parent's SingleAnimationShorthand object and build
-// it, so it should always be used to the right of a single_animation object.
-single_animation_element:
-    kIdentifierToken maybe_whitespace {
-    if (!$<single_animation>0->name) {
-      $<single_animation>0->name = new cssom::StringValue($1.ToString());
-    } else {
-      parser_impl->LogWarning(
-          @1, "animation-name value declared twice in animation.");
-    }
-  }
-  | animation_direction_list_element {
-    if (!$<single_animation>0->direction) {
-      $<single_animation>0->direction = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "animation-direction value declared twice in animation.");
-    }
-  }
-  | animation_fill_mode_list_element {
-    if (!$<single_animation>0->fill_mode) {
-      $<single_animation>0->fill_mode = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "animation-fill-mode value declared twice in animation.");
-    }
-  }
-  | animation_iteration_count_list_element {
-    if (!$<single_animation>0->iteration_count) {
-      $<single_animation>0->iteration_count = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "animation-iteration-count value declared twice in animation.");
-    }
-  }
-  | time_with_units_required {
-    if (!$<single_animation>0->duration) {
-      // The first time encountered sets the duration.
-      $<single_animation>0->duration = base::TimeDelta::FromInternalValue($1);
-    } else if (!$<single_animation>0->delay) {
-      // The second time encountered sets the delay.
-      $<single_animation>0->delay = base::TimeDelta::FromInternalValue($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "time value declared too many times in animation.");
-    }
-  }
-  | single_timing_function maybe_whitespace {
-    if (!$<single_animation>0->timing_function) {
-      $<single_animation>0->timing_function = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "animation-timing-function value declared twice in animation.");
-    }
-  }
-  | error maybe_whitespace {
-    parser_impl->LogError(@1, "unsupported property value for animation");
-    $<single_animation>0->error = true;
-  }
-  ;
-
-single_animation:
-    /* empty */ {
-    // Initialize the result, to be filled in by single_animation_element
-    $$ = new SingleAnimationShorthand();
-  }
-  | single_non_empty_animation
-  ;
-
-single_non_empty_animation:
-    single_animation single_animation_element {
-    // Propagate the list from our parent single_animation.
-    // single_animation_element will have already taken care of adding itself
-    // to the list via $0.
-    $$ = $1;
-  }
-  ;
-
-comma_separated_animation_list:
-    single_non_empty_animation {
-    scoped_ptr<SingleAnimationShorthand> single_animation($1);
-    scoped_ptr<AnimationShorthandBuilder> animation_builder(
-        new AnimationShorthandBuilder());
-
-    if (!single_animation->error) {
-      single_animation->ReplaceNullWithInitialValues();
-
-      animation_builder->delay_list_builder->push_back(
-          *single_animation->delay);
-      animation_builder->direction_list_builder->push_back(
-          single_animation->direction);
-      animation_builder->duration_list_builder->push_back(
-          *single_animation->duration);
-      animation_builder->fill_mode_list_builder->push_back(
-          single_animation->fill_mode);
-      animation_builder->iteration_count_list_builder->push_back(
-          single_animation->iteration_count);
-      animation_builder->name_list_builder->push_back(
-          single_animation->name);
-      animation_builder->timing_function_list_builder->push_back(
-          single_animation->timing_function);
-    }
-
-    $$ = animation_builder.release();
-  }
-  | comma_separated_animation_list comma single_non_empty_animation {
-    scoped_ptr<SingleAnimationShorthand> single_animation($3);
-    $$ = $1;
-
-    if (!single_animation->error) {
-      single_animation->ReplaceNullWithInitialValues();
-
-      $$->delay_list_builder->push_back(*single_animation->delay);
-      $$->direction_list_builder->push_back(single_animation->direction);
-      $$->duration_list_builder->push_back(*single_animation->duration);
-      $$->fill_mode_list_builder->push_back(single_animation->fill_mode);
-      $$->iteration_count_list_builder->push_back(
-          single_animation->iteration_count);
-      $$->name_list_builder->push_back(single_animation->name);
-      $$->timing_function_list_builder->push_back(
-          single_animation->timing_function);
-    }
-  }
-  ;
-
-// Animation shorthand property.
-//   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-shorthand-property
-animation_property_value:
-    comma_separated_animation_list {
-    scoped_ptr<AnimationShorthandBuilder> animation_builder($1);
-
-    if (animation_builder->empty()) {
-      YYERROR;
-    }
-
-    scoped_ptr<AnimationShorthand> animation(new AnimationShorthand());
-
-    animation->delay_list = new cssom::TimeListValue(
-        animation_builder->delay_list_builder.Pass());
-    animation->direction_list = new cssom::PropertyListValue(
-        animation_builder->direction_list_builder.Pass());
-    animation->duration_list = new cssom::TimeListValue(
-        animation_builder->duration_list_builder.Pass());
-    animation->fill_mode_list = new cssom::PropertyListValue(
-        animation_builder->fill_mode_list_builder.Pass());
-    animation->iteration_count_list = new cssom::PropertyListValue(
-        animation_builder->iteration_count_list_builder.Pass());
-    animation->name_list = new cssom::PropertyListValue(
-        animation_builder->name_list_builder.Pass());
-    animation->timing_function_list = new cssom::TimingFunctionListValue(
-        animation_builder->timing_function_list_builder.Pass());
-
-    $$ = animation.release();
-  }
-  | common_values_without_errors {
-    // Replicate the common value into each of the properties that animation
-    // is a shorthand for.
-    scoped_ptr<AnimationShorthand> animation(new AnimationShorthand());
-    animation->delay_list = $1;
-    animation->direction_list = $1;
-    animation->duration_list = $1;
-    animation->fill_mode_list = $1;
-    animation->iteration_count_list = $1;
-    animation->name_list = $1;
-    animation->timing_function_list = $1;
-    $$ = animation.release();
-  }
-  ;
-
-// Parse a list of time values for transition-delay.
-//   https://www.w3.org/TR/css3-transitions/#transition-delay
-transition_delay_property_value: time_list_property_value;
-
-// Parse a list of time values for transition-duration.
-//   https://www.w3.org/TR/css3-transitions/#transition-duration
-transition_duration_property_value: time_list_property_value;
-
-// Parse a list of timing function values for transition-timing-function.
-//   https://www.w3.org/TR/css3-transitions/#transition-timing-function-property
-transition_timing_function_property_value: timing_function_list_property_value;
-
-// One or more property names separated by commas.
-//   https://www.w3.org/TR/css3-transitions/#transition-property
-comma_separated_animatable_property_name_list:
-    animatable_property_token maybe_whitespace {
-    $$ = new cssom::PropertyKeyListValue::Builder();
-    $$->push_back($1);
-  }
-  | comma_separated_animatable_property_name_list comma
-    animatable_property_token maybe_whitespace {
-    scoped_ptr<cssom::PropertyKeyListValue::Builder> property_name_list($1);
-    if (property_name_list) {
-      property_name_list->push_back($3);
-    }
-    $$ = property_name_list.release();
-  }
-  | errors {
-    parser_impl->LogError(@1, "unsupported property value for animation");
-    $$ = NULL;
-  }
-  ;
-
-// Parse a list of references to property names.
-//   https://www.w3.org/TR/css3-transitions/#transition-property
-transition_property_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | comma_separated_animatable_property_name_list {
-    scoped_ptr<cssom::PropertyKeyListValue::Builder> property_name_list($1);
-    $$ = property_name_list
-         ? AddRef(new cssom::PropertyKeyListValue(property_name_list.Pass()))
-         : NULL;
-  }
-  | common_values_without_errors
-  ;
-
-// single_transition_element represents a component of a single transition.
-// It uses $0 to access its parent's SingleTransitionShorthand object and build
-// it, so it should always be used to the right of a single_transition object.
-single_transition_element:
-    animatable_property_token maybe_whitespace {
-    if (!$<single_transition>0->property) {
-      $<single_transition>0->property = $1;
-    } else {
-      parser_impl->LogWarning(
-          @1, "transition-property value declared twice in transition.");
-    }
-  }
-  | kNoneToken maybe_whitespace {
-    if (!$<single_transition>0->property) {
-      // We use cssom::kNoneProperty as a symbol that 'none' was specified
-      // here and that the entire transition-property list value should be set
-      // to the None keyword.
-      $<single_transition>0->property = cssom::kNoneProperty;
-    } else {
-      parser_impl->LogWarning(
-          @1, "transition-property value declared twice in transition.");
-    }
-  }
-  | time {
-    if (!$<single_transition>0->duration) {
-      // The first time encountered sets the duration.
-      $<single_transition>0->duration = base::TimeDelta::FromInternalValue($1);
-    } else if (!$<single_transition>0->delay) {
-      // The second time encountered sets the delay.
-      $<single_transition>0->delay = base::TimeDelta::FromInternalValue($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "time value declared twice in transition.");
-    }
-  }
-  | single_timing_function maybe_whitespace {
-    if (!$<single_transition>0->timing_function) {
-      $<single_transition>0->timing_function = MakeScopedRefPtrAndRelease($1);
-    } else {
-      parser_impl->LogWarning(
-          @1, "transition-timing-function value declared twice in transition.");
-    }
-  }
-  | error maybe_whitespace {
-    parser_impl->LogError(@1, "unsupported property value for animation");
-    $<single_transition>0->error = true;
-  }
-  ;
-
-single_transition:
-    /* empty */ {
-    // Initialize the result, to be filled in by single_transition_element
-    $$ = new SingleTransitionShorthand();
-  }
-  | single_non_empty_transition
-  ;
-
-single_non_empty_transition:
-    single_transition single_transition_element {
-    // Propagate the list from our parent single_transition.
-    // single_transition_element will have already taken care of adding itself
-    // to the list via $0.
-    $$ = $1;
-  }
-  ;
-
-comma_separated_transition_list:
-    single_non_empty_transition {
-    scoped_ptr<SingleTransitionShorthand> single_transition($1);
-    scoped_ptr<TransitionShorthandBuilder> transition_builder(
-        new TransitionShorthandBuilder());
-
-    if (!single_transition->error) {
-      single_transition->ReplaceNullWithInitialValues();
-
-      transition_builder->property_list_builder->push_back(
-          *single_transition->property);
-      transition_builder->duration_list_builder->push_back(
-          *single_transition->duration);
-      transition_builder->timing_function_list_builder->push_back(
-          single_transition->timing_function);
-      transition_builder->delay_list_builder->push_back(
-          *single_transition->delay);
-    }
-
-    $$ = transition_builder.release();
-  }
-  | comma_separated_transition_list comma single_non_empty_transition {
-    scoped_ptr<SingleTransitionShorthand> single_transition($3);
-    $$ = $1;
-
-    if (!single_transition->error) {
-      single_transition->ReplaceNullWithInitialValues();
-
-      $$->property_list_builder->push_back(*single_transition->property);
-      $$->duration_list_builder->push_back(*single_transition->duration);
-      $$->timing_function_list_builder->push_back(
-          single_transition->timing_function);
-      $$->delay_list_builder->push_back(*single_transition->delay);
-    }
-  }
-  ;
-
-// Transition shorthand property.
-//   https://www.w3.org/TR/css3-transitions/#transition
-transition_property_value:
-    comma_separated_transition_list {
-    scoped_ptr<TransitionShorthandBuilder> transition_builder($1);
-
-    // Before proceeding, check that 'none' is not specified if the
-    // number of transition statements is larger than 1, as per the
-    // specification.
-    const cssom::PropertyKeyListValue::Builder& property_list_builder =
-        *(transition_builder->property_list_builder);
-    if (property_list_builder.size() > 1) {
-      for (int i = 0; i < static_cast<int>(property_list_builder.size()); ++i) {
-        if (property_list_builder[i] == cssom::kNoneProperty) {
-          parser_impl->LogWarning(
-              @1, "If 'none' is specified, transition can only have one item.");
-          break;
-        }
-      }
-    }
-
-    scoped_ptr<TransitionShorthand> transition(new TransitionShorthand());
-
-    if (property_list_builder.empty() ||
-        (property_list_builder.size() == 1 &&
-         property_list_builder[0] == cssom::kNoneProperty)) {
-      transition->property_list = cssom::KeywordValue::GetNone();
-    } else {
-      transition->property_list = new cssom::PropertyKeyListValue(
-          transition_builder->property_list_builder.Pass());
-    }
-    if (!transition_builder->duration_list_builder->empty()) {
-      transition->duration_list = new cssom::TimeListValue(
-          transition_builder->duration_list_builder.Pass());
-    }
-    if (!transition_builder->timing_function_list_builder->empty()) {
-      transition->timing_function_list = new cssom::TimingFunctionListValue(
-          transition_builder->timing_function_list_builder.Pass());
-    }
-    if (!transition_builder->delay_list_builder->empty()) {
-      transition->delay_list = new cssom::TimeListValue(
-          transition_builder->delay_list_builder.Pass());
-    }
-
-    $$ = transition.release();
-  }
-  | common_values_without_errors {
-    // Replicate the common value into each of the properties that transition
-    // is a shorthand for.
-    scoped_ptr<TransitionShorthand> transition(new TransitionShorthand());
-    transition->property_list = $1;
-    transition->duration_list = $1;
-    transition->timing_function_list = $1;
-    transition->delay_list = $1;
-    $$ = transition.release();
-  }
-  ;
-
-unicode_range_property_value:
-    comma_separated_unicode_range_list {
-    scoped_ptr<cssom::PropertyListValue::Builder> property_value($1);
-    $$ = property_value
-         ? AddRef(new cssom::PropertyListValue(property_value.Pass()))
-         : NULL;
-  }
-  | common_values
-  ;
-
-comma_separated_unicode_range_list:
-    kUnicodeRangeToken maybe_whitespace {
-    $$ = new cssom::PropertyListValue::Builder();
-    $$->push_back(new cssom::UnicodeRangeValue($1.first, $1.second));
-  }
-  | comma_separated_unicode_range_list comma kUnicodeRangeToken
-        maybe_whitespace {
-    $$ = $1;
-    $$->push_back(new cssom::UnicodeRangeValue($3.first, $3.second));
-  }
-  ;
-
-// This property declares how white space inside the element is handled.
-//   https://www.w3.org/TR/css3-text/#white-space-property
-white_space_property_value:
-    kNormalToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNormal().get());
-  }
-  | kNoWrapToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNoWrap().get());
-  }
-  | kPreToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetPre().get());
-  }
-  | kPreLineToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetPreLine().get());
-  }
-  | kPreWrapToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetPreWrap().get());
-  }
-  | common_values
-  ;
-
-// Specifies the content width of boxes.
-//   https://www.w3.org/TR/CSS21/visudet.html#the-width-property
-width_property_value:
-    positive_length_percent_property_value
-  | auto
-  | common_values
-  ;
-
-// Specifies the minimum content width of boxes.
-//   https://www.w3.org/TR/CSS2/visudet.html#propdef-min-width
-min_width_property_value:
-    positive_length_percent_property_value
-  | common_values
-  ;
-
-// Specifies the maximum content width of boxes.
-//   https://www.w3.org/TR/CSS2/visudet.html#propdef-max-width
-max_width_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | positive_length_percent_property_value
-  | common_values
-  ;
-
-maybe_important:
-    /* empty */ { $$ = false; }
-  | kImportantToken maybe_whitespace { $$ = true; }
-  ;
-
-z_index_property_value:
-  integer {
-    $$ = AddRef(new cssom::IntegerValue($1));
-  }
-  | auto
-  | common_values
-  ;
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Animatable properties.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// Some property name identifiers can be specified as animations, either by
-// CSS animations or CSS transitions.  We explicitly list them here for use
-// in animatable property lists.
-// Note that for Cobalt we modify this list to contain only the properties that
-// are supported for animations in Cobalt.
-//   https://www.w3.org/TR/css3-transitions/#animatable-css
-animatable_property_token:
-    kAllToken {
-    $$ = cssom::kAllProperty;
-  }
-  | kBackgroundColorToken {
-    $$ = cssom::kBackgroundColorProperty;
-  }
-  | kBorderBottomColorToken {
-    $$ = cssom::kBorderBottomColorProperty;
-  }
-  | kBorderLeftColorToken {
-    $$ = cssom::kBorderLeftColorProperty;
-  }
-  | kBorderRightColorToken {
-    $$ = cssom::kBorderRightColorProperty;
-  }
-  | kBorderTopColorToken {
-    $$ = cssom::kBorderTopColorProperty;
-  }
-  | kColorToken {
-    $$ = cssom::kColorProperty;
-  }
-  | kOpacityToken {
-    $$ = cssom::kOpacityProperty;
-  }
-  | kOutlineColorToken {
-    $$ = cssom::kOutlineColorProperty;
-  }
-  | kOutlineWidthToken {
-    $$ = cssom::kOutlineWidthProperty;
-  }
-  | kTransformToken {
-    $$ = cssom::kTransformProperty;
-  }
-  ;
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Declarations.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// Consume a declaration.
-//   https://www.w3.org/TR/css3-syntax/#consume-a-declaration0
-maybe_declaration:
-    /* empty */ { $$ = NULL; }
-  | kAnimationDelayToken maybe_whitespace colon
-      animation_delay_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationDelayProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationDirectionToken maybe_whitespace colon
-      animation_direction_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationDirectionProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationDurationToken maybe_whitespace colon
-      animation_duration_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationDurationProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationFillModeToken maybe_whitespace colon
-      animation_fill_mode_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationFillModeProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationIterationCountToken maybe_whitespace colon
-      animation_iteration_count_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationIterationCountProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationNameToken maybe_whitespace colon
-      animation_name_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationNameProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationTimingFunctionToken maybe_whitespace colon
-      animation_timing_function_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kAnimationTimingFunctionProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kAnimationToken maybe_whitespace colon
-      animation_property_value maybe_important {
-    scoped_ptr<AnimationShorthand> animation($4);
-    DCHECK(animation);
-
-    scoped_ptr<PropertyDeclaration> property_declaration(
-        new PropertyDeclaration($5));
-
-    // Unpack the animation shorthand property values.
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationDelayProperty,
-            animation->delay_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationDirectionProperty,
-            animation->direction_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationDurationProperty,
-            animation->duration_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationFillModeProperty,
-            animation->fill_mode_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationIterationCountProperty,
-            animation->iteration_count_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationNameProperty,
-            animation->name_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kAnimationTimingFunctionProperty,
-            animation->timing_function_list));
-
-    $$ = property_declaration.release();
-  }
-  | kBackgroundToken maybe_whitespace colon background_property_value
-      maybe_important {
-    scoped_ptr<BackgroundShorthandLayer> background($4);
-    if (background && !background->error) {
-      background->ReplaceNullWithInitialValues();
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack the background shorthand property values.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBackgroundColorProperty,
-              background->background_color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBackgroundImageProperty,
-              background->background_image));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBackgroundPositionProperty,
-              background->background_position));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBackgroundRepeatProperty,
-              background->background_repeat));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBackgroundSizeProperty,
-              background->background_size));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kBackgroundColorToken maybe_whitespace colon background_color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBackgroundColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBackgroundImageToken maybe_whitespace colon background_image_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBackgroundImageProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBackgroundPositionToken maybe_whitespace colon
-    background_position_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBackgroundPositionProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBackgroundRepeatToken maybe_whitespace colon
-    background_repeat_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBackgroundRepeatProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBackgroundSizeToken maybe_whitespace colon background_size_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBackgroundSizeProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> border($4);
-    DCHECK(border);
-    if (!border->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border color.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftColorProperty, border->color));
-
-      // Unpack border style.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftStyleProperty, border->style));
-
-      // Unpack border width.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopWidthProperty, border->width));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightWidthProperty, border->width));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomWidthProperty, border->width));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftWidthProperty, border->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid border");
-      $$ = NULL;
-    }
-  }
-  | kBorderBottomLeftRadiusToken maybe_whitespace colon border_radius_element_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderBottomLeftRadiusProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderBottomRightRadiusToken maybe_whitespace colon border_radius_element_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderBottomRightRadiusProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderBottomToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> border($4);
-    DCHECK(border);
-    if (!border->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border bottom.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomWidthProperty, border->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid border-bottom");
-      $$ = NULL;
-    }
-  }
-  | kBorderBottomColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderBottomColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderBottomStyleToken maybe_whitespace colon line_style_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderBottomStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderBottomWidthToken maybe_whitespace colon
-      border_width_element_with_common_values maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderBottomWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderColorToken maybe_whitespace colon border_color_property_value
-      maybe_important {
-    scoped_refptr<cssom::PropertyValue> property_list_value(
-        MakeScopedRefPtrAndRelease($4));
-    if (property_list_value) {
-      BorderShorthandToLonghand shorthand_to_longhand;
-      shorthand_to_longhand.Assign4BordersBasedOnPropertyList(
-            property_list_value);
-
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border color.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopColorProperty,
-              shorthand_to_longhand.border_top));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightColorProperty,
-              shorthand_to_longhand.border_right));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomColorProperty,
-              shorthand_to_longhand.border_bottom));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftColorProperty,
-              shorthand_to_longhand.border_left));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kBorderLeftToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> border($4);
-    DCHECK(border);
-    if (!border->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border left.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftWidthProperty, border->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid border-left");
-      $$ = NULL;
-    }
-  }
-  | kBorderLeftColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderLeftColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderLeftStyleToken maybe_whitespace colon line_style_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderLeftStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderLeftWidthToken maybe_whitespace colon
-      border_width_element_with_common_values maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderLeftWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderRadiusToken maybe_whitespace colon border_radius_property_value
-      maybe_important {
-    scoped_refptr<cssom::PropertyValue> property_list_value(
-        MakeScopedRefPtrAndRelease($4));
-    if (property_list_value) {
-      BorderShorthandToLonghand shorthand_to_longhand;
-      shorthand_to_longhand.Assign4BordersBasedOnPropertyList(
-            property_list_value);
-
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border radius.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopLeftRadiusProperty,
-              shorthand_to_longhand.border_top));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopRightRadiusProperty,
-              shorthand_to_longhand.border_right));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomRightRadiusProperty,
-              shorthand_to_longhand.border_bottom));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomLeftRadiusProperty,
-              shorthand_to_longhand.border_left));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kBorderRightToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> border($4);
-    DCHECK(border);
-    if (!border->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border right.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightWidthProperty, border->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid border-right");
-      $$ = NULL;
-    }
-  }
-  | kBorderRightColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderRightColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderRightStyleToken maybe_whitespace colon line_style_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderRightStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderRightWidthToken maybe_whitespace colon
-      border_width_element_with_common_values maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderRightWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderStyleToken maybe_whitespace colon border_style_property_value
-      maybe_important {
-    scoped_refptr<cssom::PropertyValue> property_list_value(
-        MakeScopedRefPtrAndRelease($4));
-    if (property_list_value) {
-      BorderShorthandToLonghand shorthand_to_longhand;
-      shorthand_to_longhand.Assign4BordersBasedOnPropertyList(
-            property_list_value);
-
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border style.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopStyleProperty,
-              shorthand_to_longhand.border_top));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderRightStyleProperty,
-              shorthand_to_longhand.border_right));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderBottomStyleProperty,
-              shorthand_to_longhand.border_bottom));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderLeftStyleProperty,
-              shorthand_to_longhand.border_left));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kBorderTopToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> border($4);
-    DCHECK(border);
-    if (!border->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack border top.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopColorProperty, border->color));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopStyleProperty, border->style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kBorderTopWidthProperty, border->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid border-right");
-      $$ = NULL;
-    }
-  }
-  | kBorderTopColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderTopColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderTopLeftRadiusToken maybe_whitespace colon border_radius_element_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderTopLeftRadiusProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderTopRightRadiusToken maybe_whitespace colon border_radius_element_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderTopRightRadiusProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderTopStyleToken maybe_whitespace colon line_style_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderTopStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderTopWidthToken maybe_whitespace colon
-      border_width_element_with_common_values maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBorderTopWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBorderWidthToken maybe_whitespace colon border_width_property_value
-      maybe_important {
-    scoped_refptr<cssom::PropertyValue> property_list_value(
-        MakeScopedRefPtrAndRelease($4));
-      if (property_list_value) {
-        BorderShorthandToLonghand shorthand_to_longhand;
-        shorthand_to_longhand.Assign4BordersBasedOnPropertyList(
-            property_list_value);
-
-        scoped_ptr<PropertyDeclaration> property_declaration(
-            new PropertyDeclaration($5));
-
-        // Unpack border width.
-        property_declaration->property_values.push_back(
-            PropertyDeclaration::PropertyKeyValuePair(
-                cssom::kBorderTopWidthProperty,
-                shorthand_to_longhand.border_top));
-        property_declaration->property_values.push_back(
-            PropertyDeclaration::PropertyKeyValuePair(
-                cssom::kBorderRightWidthProperty,
-                shorthand_to_longhand.border_right));
-        property_declaration->property_values.push_back(
-            PropertyDeclaration::PropertyKeyValuePair(
-                cssom::kBorderBottomWidthProperty,
-                shorthand_to_longhand.border_bottom));
-        property_declaration->property_values.push_back(
-            PropertyDeclaration::PropertyKeyValuePair(
-                cssom::kBorderLeftWidthProperty,
-                shorthand_to_longhand.border_left));
-
-        $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kBottomToken maybe_whitespace colon offset_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBottomProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kBoxShadowToken maybe_whitespace colon box_shadow_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kBoxShadowProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kContentToken maybe_whitespace colon content_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kContentProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kDisplayToken maybe_whitespace colon display_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kDisplayProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kFilterToken maybe_whitespace colon filter_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kFilterProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kFontToken maybe_whitespace colon font_property_value maybe_important {
-    scoped_ptr<FontShorthand> font($4);
-    DCHECK(font);
-
-    scoped_ptr<PropertyDeclaration> property_declaration(
-        new PropertyDeclaration($5));
-
-    if (!font->error) {
-      font->ReplaceNullWithInitialValues();
-
-      // Unpack the font shorthand property values.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kFontStyleProperty,
-              font->font_style));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kFontWeightProperty,
-              font->font_weight));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kFontSizeProperty,
-              font->font_size));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kFontFamilyProperty,
-              font->font_family));
-    }
-
-    $$ = property_declaration.release();
-  }
-  | kFontFamilyToken maybe_whitespace colon font_family_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kFontFamilyProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kFontSizeToken maybe_whitespace colon font_size_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kFontSizeProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kFontStyleToken maybe_whitespace colon font_style_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kFontStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kFontWeightToken maybe_whitespace colon font_weight_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kFontWeightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kHeightToken maybe_whitespace colon height_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kHeightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kLeftToken maybe_whitespace colon offset_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kLeftProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kLineHeightToken maybe_whitespace colon line_height_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kLineHeightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMarginBottomToken maybe_whitespace colon margin_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMarginBottomProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMarginLeftToken maybe_whitespace colon margin_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMarginLeftProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMarginRightToken maybe_whitespace colon margin_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMarginRightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMarginTopToken maybe_whitespace colon margin_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMarginTopProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMarginToken maybe_whitespace colon margin_property_value maybe_important {
-    scoped_ptr<MarginOrPaddingShorthand> margin($4);
-    if (margin) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kMarginTopProperty, margin->top));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kMarginRightProperty, margin->right));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kMarginBottomProperty, margin->bottom));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kMarginLeftProperty, margin->left));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kMaxHeightToken maybe_whitespace colon max_height_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMaxHeightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMaxWidthToken maybe_whitespace colon max_width_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMaxWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMinHeightToken maybe_whitespace colon min_height_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMinHeightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kMinWidthToken maybe_whitespace colon min_width_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kMinWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOpacityToken maybe_whitespace colon opacity_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOpacityProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOutlineToken maybe_whitespace colon border_or_outline_property_value
-      maybe_important {
-    scoped_ptr<BorderOrOutlineShorthand> outline($4);
-    DCHECK(outline);
-    if (!outline->error) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      // Unpack outline color.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kOutlineColorProperty, outline->color));
-
-      // Unpack outline style.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kOutlineStyleProperty, outline->style));
-
-      // Unpack outline width.
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kOutlineWidthProperty, outline->width));
-
-      $$ = property_declaration.release();
-    } else {
-      parser_impl->LogWarning(@1, "invalid outline");
-      $$ = NULL;
-    }
-  }
-  | kOutlineColorToken maybe_whitespace colon color_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOutlineColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOutlineStyleToken maybe_whitespace colon line_style_with_common_values
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOutlineStyleProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOutlineWidthToken maybe_whitespace colon
-      border_width_element_with_common_values maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOutlineWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOverflowToken maybe_whitespace colon overflow_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOverflowProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kOverflowWrapToken maybe_whitespace colon overflow_wrap_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kOverflowWrapProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPaddingBottomToken maybe_whitespace colon padding_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPaddingBottomProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPaddingLeftToken maybe_whitespace colon padding_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPaddingLeftProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPaddingRightToken maybe_whitespace colon padding_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPaddingRightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPaddingTopToken maybe_whitespace colon padding_side_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPaddingTopProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPaddingToken maybe_whitespace colon padding_property_value
-      maybe_important {
-    scoped_ptr<MarginOrPaddingShorthand> padding($4);
-    if (padding) {
-      scoped_ptr<PropertyDeclaration> property_declaration(
-          new PropertyDeclaration($5));
-
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kPaddingTopProperty, padding->top));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kPaddingRightProperty, padding->right));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kPaddingBottomProperty, padding->bottom));
-      property_declaration->property_values.push_back(
-          PropertyDeclaration::PropertyKeyValuePair(
-              cssom::kPaddingLeftProperty, padding->left));
-
-      $$ = property_declaration.release();
-    } else {
-      $$ = NULL;
-    }
-  }
-  | kPointerEventsToken maybe_whitespace colon pointer_events_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPointerEventsProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kPositionToken maybe_whitespace colon position_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kPositionProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kRightToken maybe_whitespace colon offset_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kRightProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kSrcToken maybe_whitespace colon font_face_src_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kSrcProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextAlignToken maybe_whitespace colon text_align_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextAlignProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextIndentToken maybe_whitespace colon text_indent_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextIndentProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextDecorationToken maybe_whitespace colon text_decoration_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextDecorationLineProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextDecorationColorToken maybe_whitespace colon
-      color_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextDecorationColorProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextDecorationLineToken maybe_whitespace colon
-      text_decoration_line_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextDecorationLineProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextOverflowToken maybe_whitespace colon text_overflow_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextOverflowProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextShadowToken maybe_whitespace colon text_shadow_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextShadowProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTextTransformToken maybe_whitespace colon text_transform_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTextTransformProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTopToken maybe_whitespace colon offset_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTopProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransformToken maybe_whitespace colon transform_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransformProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransformOriginToken maybe_whitespace colon transform_origin_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransformOriginProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransitionToken maybe_whitespace colon
-      transition_property_value maybe_important {
-    scoped_ptr<TransitionShorthand> transition($4);
-    DCHECK(transition);
-
-    scoped_ptr<PropertyDeclaration> property_declaration(
-        new PropertyDeclaration($5));
-
-    // Unpack the transition shorthand property values.
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kTransitionPropertyProperty,
-            transition->property_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kTransitionDurationProperty,
-            transition->duration_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kTransitionTimingFunctionProperty,
-            transition->timing_function_list));
-    property_declaration->property_values.push_back(
-        PropertyDeclaration::PropertyKeyValuePair(
-            cssom::kTransitionDelayProperty,
-            transition->delay_list));
-
-    $$ = property_declaration.release();
-  }
-  | kTransitionDelayToken maybe_whitespace colon
-      transition_delay_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransitionDelayProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransitionDurationToken maybe_whitespace colon
-      transition_duration_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransitionDurationProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransitionPropertyToken maybe_whitespace colon
-      transition_property_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransitionPropertyProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kTransitionTimingFunctionToken maybe_whitespace colon
-      transition_timing_function_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kTransitionTimingFunctionProperty,
-                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kUnicodeRangePropertyToken maybe_whitespace colon
-      unicode_range_property_value maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kUnicodeRangeProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kVerticalAlignToken maybe_whitespace colon vertical_align_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kVerticalAlignProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kVisibilityToken maybe_whitespace colon visibility_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kVisibilityProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kWhiteSpacePropertyToken maybe_whitespace colon white_space_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kWhiteSpaceProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kWidthToken maybe_whitespace colon width_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kWidthProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kZIndexToken maybe_whitespace colon z_index_property_value
-      maybe_important {
-    $$ = $4 ? new PropertyDeclaration(cssom::kZIndexProperty,
-                                      MakeScopedRefPtrAndRelease($4), $5)
-            : NULL;
-  }
-  | kIdentifierToken maybe_whitespace colon errors {
-    std::string property_name = $1.ToString();
-    DCHECK_GT(property_name.size(), 0U);
-
-    // Do not warn about non-standard or non-WebKit properties.
-    if (property_name[0] != '-') {
-      base::AutoLock lock(non_trivial_static_fields.Get().lock);
-      base::hash_set<std::string>& properties_warned_about =
-          non_trivial_static_fields.Get().properties_warned_about;
-
-      if (properties_warned_about.find(property_name) ==
-          properties_warned_about.end()) {
-        properties_warned_about.insert(property_name);
-        parser_impl->LogWarning(@1, "unsupported property " + property_name);
-      }
-    }
-
-    $$ = NULL;
-  }
-  | errors {
-    parser_impl->LogWarning(@1, "invalid declaration");
-    $$ = NULL;
-  }
-  ;
-
-semicolon: ';' maybe_whitespace ;
-
-// Consume a list of declarations.
-//   https://www.w3.org/TR/css3-syntax/#consume-a-list-of-declarations0
-style_declaration_list:
-    maybe_declaration {
-    $$ = AddRef(new cssom::CSSDeclaredStyleData());
-
-    scoped_ptr<PropertyDeclaration> property_declaration($1);
-    if (property_declaration) {
-      property_declaration->Apply($$);
-      for (size_t i = 0;
-           i < property_declaration->unsupported_property_keys.size(); ++i) {
-        std::string unsupported_property_name =
-            cssom::GetPropertyName(
-                property_declaration->unsupported_property_keys[i]);
-        parser_impl->LogWarning(
-            @1, "unsupported style property: "  + unsupported_property_name);
-      }
-    }
-  }
-  | style_declaration_list semicolon maybe_declaration {
-    $$ = $1;
-
-    scoped_ptr<PropertyDeclaration> property_declaration($3);
-    if (property_declaration) {
-      property_declaration->Apply($$);
-      for (size_t i = 0;
-           i < property_declaration->unsupported_property_keys.size(); ++i) {
-        std::string unsupported_property_name =
-            cssom::GetPropertyName(
-                property_declaration->unsupported_property_keys[i]);
-        parser_impl->LogWarning(
-            @1, "unsupported style property: "  + unsupported_property_name);
-      }
-    }
-  }
-  ;
-
-font_face_declaration_list:
-    maybe_declaration {
-    $$ = AddRef(new cssom::CSSFontFaceDeclarationData());
-
-    scoped_ptr<PropertyDeclaration> property_declaration($1);
-    if (property_declaration) {
-      property_declaration->Apply($$);
-    }
-  }
-  | font_face_declaration_list semicolon maybe_declaration {
-    $$ = $1;
-
-    scoped_ptr<PropertyDeclaration> property_declaration($3);
-    if (property_declaration) {
-      property_declaration->Apply($$);
-    }
-  }
-  ;
-
-style_declaration_block:
-    '{' maybe_whitespace style_declaration_list '}' maybe_whitespace {
-    $$ = AddRef(new cssom::CSSRuleStyleDeclaration(
-             MakeScopedRefPtrAndRelease($3), parser_impl->css_parser()));
-  }
-  ;
-
-rule_list_block:
-    '{' maybe_whitespace rule_list '}' maybe_whitespace {
-    $$ = $3;
-  }
-  | semicolon {
-    $$ = AddRef(new cssom::CSSRuleList());
-  }
-  ;
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Rules.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// A style rule is a qualified rule that associates a selector list with a list
-// of property declarations.
-//   https://www.w3.org/TR/css3-syntax/#style-rule
-style_rule:
-    selector_list style_declaration_block {
-    scoped_ptr<cssom::Selectors> selectors($1);
-    scoped_refptr<cssom::CSSRuleStyleDeclaration> style =
-        MakeScopedRefPtrAndRelease($2);
-
-    if (selectors) {
-      $$ = AddRef(new cssom::CSSStyleRule(selectors->Pass(), style));
-    } else {
-      $$ = NULL;
-    }
-  }
-  ;
-
-// To parse a CSS stylesheet, interpret all of the resulting top-level qualified
-// rules as style rules.
-//   https://www.w3.org/TR/css3-syntax/#css-stylesheets
-qualified_rule:
-    style_rule
-  | error style_declaration_block {
-    scoped_refptr<cssom::CSSRuleStyleDeclaration> unused_style =
-        MakeScopedRefPtrAndRelease($2);
-    parser_impl->LogWarning(@1, "invalid qualified rule");
-    $$ = NULL;
-  }
-  ;
-
-invalid_rule:
-    kInvalidAtBlockToken maybe_whitespace {
-    parser_impl->LogWarning(@1, "invalid rule " + $1.ToString());
-  }
-  | kOtherBrowserAtBlockToken maybe_whitespace {
-    // Do not warn about other browser at rules.
-  }
-  ;
-
-// Consume a list of rules.
-//   https://www.w3.org/TR/css3-syntax/#consume-a-list-of-rules
-rule:
-    kSgmlCommentDelimiterToken maybe_whitespace { $$ = NULL; }
-  | qualified_rule { $$ = $1; }
-  | at_font_face_rule { $$ = $1; }
-  | at_media_rule { $$ = $1; }
-  | at_keyframes_rule { $$ = $1; }
-  | invalid_rule { $$ = NULL; }
-  ;
-
-rule_list:
-    /* empty */ {
-    $$ = AddRef(new cssom::CSSRuleList());
-  }
-  | rule_list rule {
-    $$ = $1;
-    scoped_refptr<cssom::CSSRule> css_rule =
-        MakeScopedRefPtrAndRelease($2);
-    if (css_rule) {
-      $$->AppendCSSRule(css_rule);
-    }
-  }
-  ;
-
-
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-// Entry points.
-// ...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:...:.
-
-// To parse a stylesheet, consume a list of rules.
-//   https://www.w3.org/TR/css3-syntax/#parse-a-stylesheet
-style_sheet:
-    rule_list {
-    $$ = AddRef(new cssom::CSSStyleSheet(parser_impl->css_parser()));
-    $$->set_css_rules(MakeScopedRefPtrAndRelease($1));
-  }
-  ;
-
-// Parser entry points.
-//   http://dev.w3.org/csswg/css-syntax/#parser-entry-points
-entry_point:
-  // Parses the entire stylesheet.
-    kStyleSheetEntryPointToken maybe_whitespace style_sheet {
-    scoped_refptr<cssom::CSSStyleSheet> style_sheet =
-        MakeScopedRefPtrAndRelease($3);
-    parser_impl->set_style_sheet(style_sheet);
-  }
-  // Parses the media list.
-  | kMediaListEntryPointToken maybe_whitespace media_list {
-    scoped_refptr<cssom::MediaList> media_list =
-        MakeScopedRefPtrAndRelease($3);
-    parser_impl->set_media_list(media_list);
-  }
-  // Parses the media query.
-  | kMediaQueryEntryPointToken maybe_whitespace media_query {
-    scoped_refptr<cssom::MediaQuery> media_query =
-        MakeScopedRefPtrAndRelease($3);
-    parser_impl->set_media_query(media_query);
-  }
-  // Parses the rule.
-  | kRuleEntryPointToken maybe_whitespace rule {
-    scoped_refptr<cssom::CSSRule> rule(MakeScopedRefPtrAndRelease($3));
-    parser_impl->set_rule(rule);
-  }
-  // Parses the contents of a HTMLElement.style attribute.
-  | kStyleDeclarationListEntryPointToken maybe_whitespace
-        style_declaration_list {
-    scoped_refptr<cssom::CSSDeclaredStyleData> declaration_data =
-        MakeScopedRefPtrAndRelease($3);
-    parser_impl->set_style_declaration_data(declaration_data);
-  }
-  // Parses the contents of an @font-face rule.
-  | kFontFaceDeclarationListEntryPointToken maybe_whitespace
-        font_face_declaration_list {
-    scoped_refptr<cssom::CSSFontFaceDeclarationData> declaration_data =
-        MakeScopedRefPtrAndRelease($3);
-    parser_impl->set_font_face_declaration_data(declaration_data);
-  }
-  // Parses a single non-shorthand property value.
-  | kPropertyValueEntryPointToken maybe_whitespace maybe_declaration {
-    scoped_ptr<PropertyDeclaration> property_declaration($3);
-    if (property_declaration != NULL) {
-      if (property_declaration->property_values.size() != 1) {
-        parser_impl->LogError(
-            @1, "Cannot parse shorthand properties as single property values.");
-      } else {
-        if (property_declaration->is_important) {
-          parser_impl->LogWarning(
-            @1,
-            "!important is not allowed when setting single property values.");
-        } else {
-          if (!property_declaration->property_values[0].value) {
-            parser_impl->LogWarning(
-              @1, "declaration must have a property value.");
-          } else {
-            parser_impl->set_property_value(
-                property_declaration->property_values[0].value);
-          }
-        }
-      }
-    }
-  }
-  // Parses the property value and correspondingly sets the values of a passed
-  // in CSSDeclarationData.
-  // This is Cobalt's equivalent of a "list of component values".
-  | kPropertyIntoDeclarationDataEntryPointToken maybe_whitespace
-        maybe_declaration {
-    scoped_ptr<PropertyDeclaration> property_declaration($3);
-    if (property_declaration != NULL) {
-      if (property_declaration->is_important) {
-        parser_impl->LogError(
-            @1, "!important is not allowed when setting single property value");
-      } else {
-        DCHECK(parser_impl->into_declaration_data());
-        property_declaration->Apply(
-            parser_impl->into_declaration_data());
-      }
-    }
-  }
-  ;
-
-// Filters that can be applied to the object's rendering.
-//   https://www.w3.org/TR/filter-effects-1/#FilterProperty
-filter_property_value:
-    kNoneToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetNone().get());
-  }
-  | filter_function_list {
-    scoped_ptr<cssom::FilterFunctionListValue::Builder> property_value($1);
-    $$ = AddRef(new cssom::FilterFunctionListValue(property_value->Pass()));
-  }
-  | common_values
-  ;
-
-filter_function_list:
-  // TODO: Parse list of filter_function's. This only parses one-element lists.
-    filter_function {
-    $$ = new cssom::FilterFunctionListValue::Builder();
-    $$->push_back($1);
-  }
-  ;
-
-// The set of allowed filter functions.
-//   https://www.w3.org/TR/filter-effects-1/
-filter_function:
-    cobalt_mtm_filter_function {
-    $$ = $1;
-  }
-  ;
-
-cobalt_mtm_filter_function:
-  // Encodes an mtm filter. Currently the only type of filter function supported.
-    cobalt_mtm_function_name maybe_whitespace cobalt_map_to_mesh_spec comma angle
-        angle comma cobalt_mtm_transform_function maybe_cobalt_mtm_stereo_mode
-        ')' maybe_whitespace {
-    scoped_ptr<cssom::MapToMeshFunction::MeshSpec>
-        mesh_spec($3);
-    scoped_ptr<glm::mat4> transform($8);
-    scoped_refptr<cssom::KeywordValue> stereo_mode =
-        MakeScopedRefPtrAndRelease($9);
-
-    if (!parser_impl->supports_map_to_mesh()) {
-      YYERROR;
-    } else {
-      $$ = new cssom::MapToMeshFunction(
-          mesh_spec.Pass(),
-          $5,
-          $6,
-          *transform,
-          stereo_mode);
-    }
-  }
-  // map-to-mesh filter with the rectangular built-in mesh. Does not take FOV
-  // or transforms.
-  |  cobalt_mtm_function_name maybe_whitespace kRectangularToken comma
-        kNoneToken comma kNoneToken maybe_cobalt_mtm_stereo_mode
-        ')' maybe_whitespace {
-    scoped_refptr<cssom::KeywordValue> stereo_mode =
-        MakeScopedRefPtrAndRelease($8);
-
-    if (!parser_impl->supports_map_to_mesh_rectangular()) {
-      YYERROR;
-    } else {
-      $$ = new cssom::MapToMeshFunction(cssom::MapToMeshFunction::kRectangular,
-                                        stereo_mode);
-    }
-  }
-  ;
-
-cobalt_map_to_mesh_spec:
-    kEquirectangularToken {
-    $$ = new cssom::MapToMeshFunction::MeshSpec(
-        cssom::MapToMeshFunction::kEquirectangular);
-  }
-  | url cobalt_mtm_resolution_matched_mesh_list {
-    scoped_refptr<cssom::PropertyValue> url = MakeScopedRefPtrAndRelease($1);
-    scoped_ptr<cssom::MapToMeshFunction::ResolutionMatchedMeshListBuilder>
-        resolution_matched_mesh_urls($2);
-
-    $$ = new cssom::MapToMeshFunction::MeshSpec(
-        cssom::MapToMeshFunction::kUrls,
-        url,
-        resolution_matched_mesh_urls->Pass());
-  }
-  ;
-
-cobalt_mtm_function_name:
-    kCobaltMtmFunctionToken
-  | kMapToMeshFunctionToken
-  ;
-
-cobalt_mtm_resolution_matched_mesh_list:
-    /* empty */ {
-    $$ = new cssom::MapToMeshFunction::ResolutionMatchedMeshListBuilder();
-  }
-  // Specifies a different mesh for a particular image resolution.
-  | cobalt_mtm_resolution_matched_mesh_list cobalt_mtm_resolution_matched_mesh {
-    $$ = $1;
-    $$->push_back($2);
-  }
-  ;
-
-cobalt_mtm_resolution_matched_mesh:
-    non_negative_integer non_negative_integer url {
-    $$ = new cssom::MapToMeshFunction::ResolutionMatchedMesh($1, $2,
-      MakeScopedRefPtrAndRelease($3));
-  }
-  ;
-
-// The set of transform functions allowed in MTM filters, currently a separate
-// production hierarchy from the main <transform_function> and represented as a
-// glm::mat4.
-//   https://www.w3.org/TR/css-transforms-1/#three-d-transform-functions
-cobalt_mtm_transform_function:
-  // Specifies an arbitrary affine 3D transformation, currently the only
-  // supported transform in MTM.
-    kMatrix3dFunctionToken maybe_whitespace number_matrix ')' maybe_whitespace {
-    scoped_ptr<std::vector<float> > matrix($3);
-    if (matrix == NULL || matrix->size() !=  16) {
-      parser_impl->LogError(
-          @3,
-          "matrix3d function expects 16 floating-point numbers as arguments");
-      YYERROR;
-    } else {
-      // GLM and the W3 spec both use column-major order.
-      $$ = new glm::mat4(glm::make_mat4(&(*matrix)[0]));
-    }
-  }
-  ;
-
-number_matrix:
-    number {
-    $$ = new std::vector<float>(1, $1);
-  }
-  | number_matrix comma number {
-    $$ = $1;
-    $$->push_back($3);
-  }
-  ;
-
-maybe_cobalt_mtm_stereo_mode:
-    /* empty */ {
-    $$ = AddRef(cssom::KeywordValue::GetMonoscopic().get());
-  }
-  | comma cobalt_mtm_stereo_mode {
-    $$ = $2;
-  }
-  ;
-
-cobalt_mtm_stereo_mode:
-    kMonoscopicToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetMonoscopic().get());
-  }
-  | kStereoscopicLeftRightToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetStereoscopicLeftRight().get());
-  }
-  | kStereoscopicTopBottomToken maybe_whitespace {
-    $$ = AddRef(cssom::KeywordValue::GetStereoscopicTopBottom().get());
-  }
-  ;
diff --git a/src/cobalt/css_parser/grammar.h b/src/cobalt/css_parser/grammar.h
index 37ea62b..977ba1af 100644
--- a/src/cobalt/css_parser/grammar.h
+++ b/src/cobalt/css_parser/grammar.h
@@ -89,9 +89,7 @@
 struct MarginOrPaddingShorthand;
 class ParserImpl;
 struct PropertyDeclaration;
-#if BISON_VERSION_MAJOR >= 3
 class Scanner;
-#endif  // BISON_VERSION_MAJOR >= 3
 
 // Override the default source location type from Bison with our own.
 struct cobalt_yyltype {
@@ -113,12 +111,8 @@
 
 // A header generated by Bison must be included inside our namespace
 // to avoid global namespace pollution.
-#if BISON_VERSION_MAJOR >= 3
 #include "cobalt/css_parser/grammar_generated.h"
 typedef YYSTYPE TokenValue;
-#else
-#include "cobalt/css_parser/grammar-bison-2_generated.h"
-#endif
 
 }  // namespace css_parser
 }  // namespace cobalt
diff --git a/src/cobalt/css_parser/grammar.y b/src/cobalt/css_parser/grammar.y
index 63e26c9..4ce4b67 100644
--- a/src/cobalt/css_parser/grammar.y
+++ b/src/cobalt/css_parser/grammar.y
@@ -14,6 +14,8 @@
 
 // This file contains a definition of CSS grammar.
 
+%require "3.0"
+
 // A reentrant parser.
 %define api.pure full
 
diff --git a/src/cobalt/css_parser/parser.cc b/src/cobalt/css_parser/parser.cc
index 2b2c2fe..a2e28c9 100644
--- a/src/cobalt/css_parser/parser.cc
+++ b/src/cobalt/css_parser/parser.cc
@@ -86,10 +86,6 @@
 #include "cobalt/cssom/url_value.h"
 #include "nb/memory_scope.h"
 
-#if BISON_VERSION_MAJOR == 2
-#pragma message ("Building with bison 2 is deprecated. Please upgrade to bison 3")
-#endif  // BISON_VERSION_MAJOR == 2
-
 namespace cobalt {
 namespace css_parser {
 
@@ -139,10 +135,6 @@
   scoped_refptr<cssom::MediaList> ParseMediaList();
   scoped_refptr<cssom::MediaQuery> ParseMediaQuery();
 
-#if BISON_VERSION_MAJOR == 2
-  Scanner& scanner() { return scanner_; }
-#endif  // BISON_VERSION_MAJOR == 2
-
   void set_last_syntax_error_location(
       const YYLTYPE& last_syntax_error_location) {
     last_syntax_error_location_ = last_syntax_error_location;
@@ -237,11 +229,7 @@
     callback.Run(message + "\n" + input);
   }
 
-#if BISON_VERSION_MAJOR >= 3
   friend int yyparse(ParserImpl* parser_impl, Scanner* scanner);
-#else  // BISON_VERSION_MAJOR >= 3
-  friend int yyparse(ParserImpl* parser_impl);
-#endif  // BISON_VERSION_MAJOR >= 3
 };
 
 // TODO: Stop deduplicating warnings.
@@ -402,11 +390,7 @@
   // see http://www.gnu.org/software/bison/manual/html_node/Parser-Function.html
   TRACE_EVENT0("cobalt::css_parser", "ParseImpl::Parse");
   last_syntax_error_location_ = base::nullopt;
-#if BISON_VERSION_MAJOR >= 3
   int error_code(yyparse(this, &scanner_));
-#else  // BISON_VERSION_MAJOR >= 3
-  int error_code(yyparse(this));
-#endif  // BISON_VERSION_MAJOR >= 3
   switch (error_code) {
     case 0:
       // Parsed successfully or was able to recover from errors.
@@ -517,11 +501,7 @@
 // syntax error. Most of error reporting is implemented in semantic actions
 // in the grammar.
 inline void yyerror(YYLTYPE* source_location, ParserImpl* parser_impl,
-#if BISON_VERSION_MAJOR >= 3
                     Scanner* /*scanner*/, const char* /*message*/) {
-#else  // BISON_VERSION_MAJOR >= 3
-                    const char* /*message*/) {
-#endif  // BISON_VERSION_MAJOR >= 3
   parser_impl->set_last_syntax_error_location(*source_location);
 }
 
@@ -545,11 +525,7 @@
 
 // A header generated by Bison must be included inside our namespace
 // to avoid global namespace pollution.
-#if BISON_VERSION_MAJOR < 3
-#include "cobalt/css_parser/grammar-bison-2_impl_generated.h"
-#else
 #include "cobalt/css_parser/grammar_impl_generated.h"
-#endif  // BISON_VERSION_MAJOR < 3
 
 #if defined(__clang__)
 #pragma clang diagnostic pop
diff --git a/src/cobalt/cssom/css_condition_rule.cc b/src/cobalt/cssom/css_condition_rule.cc
index e16990d..2ed2e1c 100644
--- a/src/cobalt/cssom/css_condition_rule.cc
+++ b/src/cobalt/cssom/css_condition_rule.cc
@@ -25,8 +25,6 @@
   return cached_condition_value_changed;
 }
 
-CSSConditionRule::CSSConditionRule() : cached_condition_value_(false) {}
-
 CSSConditionRule::CSSConditionRule(
     const scoped_refptr<CSSRuleList>& css_rule_list)
     : CSSGroupingRule(css_rule_list), cached_condition_value_(false) {}
diff --git a/src/cobalt/cssom/css_condition_rule.h b/src/cobalt/cssom/css_condition_rule.h
index 525947d..6148618 100644
--- a/src/cobalt/cssom/css_condition_rule.h
+++ b/src/cobalt/cssom/css_condition_rule.h
@@ -56,7 +56,6 @@
   DEFINE_WRAPPABLE_TYPE(CSSConditionRule);
 
  protected:
-  CSSConditionRule();
   explicit CSSConditionRule(const scoped_refptr<CSSRuleList>& css_rule_list);
 
   ~CSSConditionRule() override {}
diff --git a/src/cobalt/cssom/css_grouping_rule.cc b/src/cobalt/cssom/css_grouping_rule.cc
index e56e28d..549d0c9 100644
--- a/src/cobalt/cssom/css_grouping_rule.cc
+++ b/src/cobalt/cssom/css_grouping_rule.cc
@@ -20,16 +20,13 @@
 namespace cobalt {
 namespace cssom {
 
-CSSGroupingRule::CSSGroupingRule() {}
-
 CSSGroupingRule::CSSGroupingRule(
     const scoped_refptr<CSSRuleList>& css_rule_list)
-    : css_rule_list_(css_rule_list) {}
+    : css_rule_list_(css_rule_list) {
+  DCHECK(css_rule_list_);
+}
 
 const scoped_refptr<CSSRuleList>& CSSGroupingRule::css_rules() {
-  if (!css_rule_list_) {
-    set_css_rules(new CSSRuleList());
-  }
   return css_rule_list_;
 }
 
@@ -38,6 +35,20 @@
   return css_rules()->InsertRule(rule, index);
 }
 
+void CSSGroupingRule::SetIndex(int index) {
+  int index_difference = index - this->index();
+  CSSRule::SetIndex(index);
+
+  // Update all of our child rules' indices so that they are consistently
+  // indexed within the parent's rule indices.
+  for (unsigned int i = 0; i < css_rule_list_->length(); ++i) {
+    css_rule_list_->Item(i)->SetIndex(css_rule_list_->Item(i)->index() +
+                                      index_difference);
+  }
+}
+
+int CSSGroupingRule::IndexWidth() const { return css_rule_list_->length(); }
+
 void CSSGroupingRule::set_css_rules(
     const scoped_refptr<CSSRuleList>& css_rule_list) {
   DCHECK(css_rule_list);
diff --git a/src/cobalt/cssom/css_grouping_rule.h b/src/cobalt/cssom/css_grouping_rule.h
index 17132ee..ec71af8 100644
--- a/src/cobalt/cssom/css_grouping_rule.h
+++ b/src/cobalt/cssom/css_grouping_rule.h
@@ -35,7 +35,6 @@
 //   https://www.w3.org/TR/css3-conditional/#cssgroupingrule
 class CSSGroupingRule : public CSSRule {
  public:
-  CSSGroupingRule();
   explicit CSSGroupingRule(const scoped_refptr<CSSRuleList>& css_rule_list);
 
   // Web API: CSSGroupingRule
@@ -55,6 +54,9 @@
     NOTREACHED();
   }
 
+  void SetIndex(int index) override;
+  int IndexWidth() const override;
+
   // Sets the CSS rule list for the grouping rule.
   void set_css_rules(const scoped_refptr<CSSRuleList>& css_rule_list);
 
diff --git a/src/cobalt/cssom/css_grouping_rule_test.cc b/src/cobalt/cssom/css_grouping_rule_test.cc
index a837247..c43f0e5 100644
--- a/src/cobalt/cssom/css_grouping_rule_test.cc
+++ b/src/cobalt/cssom/css_grouping_rule_test.cc
@@ -31,6 +31,8 @@
 
 class FakeCSSGroupingRule : public CSSGroupingRule {
  public:
+  FakeCSSGroupingRule() : CSSGroupingRule(new CSSRuleList()) {}
+
   // From CSSRule.
   Type type() const override { return kMediaRule; }
   std::string css_text(
diff --git a/src/cobalt/cssom/css_media_rule.cc b/src/cobalt/cssom/css_media_rule.cc
index d802d78..fbe073e 100644
--- a/src/cobalt/cssom/css_media_rule.cc
+++ b/src/cobalt/cssom/css_media_rule.cc
@@ -22,11 +22,11 @@
 namespace cobalt {
 namespace cssom {
 
-CSSMediaRule::CSSMediaRule() {}
-
 CSSMediaRule::CSSMediaRule(const scoped_refptr<MediaList>& media_list,
                            const scoped_refptr<CSSRuleList>& css_rule_list)
-    : CSSConditionRule(css_rule_list), media_list_(media_list) {}
+    : CSSConditionRule(css_rule_list), media_list_(media_list) {
+  DCHECK(media_list_);
+}
 
 const scoped_refptr<MediaList>& CSSMediaRule::media() const {
   return media_list_;
@@ -49,15 +49,9 @@
   NOTIMPLEMENTED() << "CSSMediaRule css_text setting not implemented yet.";
 }
 
-std::string CSSMediaRule::condition_text() {
-  return media_list_ ? media_list_->media_text() : "";
-}
+std::string CSSMediaRule::condition_text() { return media_list_->media_text(); }
 
 void CSSMediaRule::set_condition_text(const std::string& condition) {
-  if (!media_list_) {
-    DCHECK(parent_style_sheet());
-    media_list_ = new MediaList(parent_style_sheet()->css_parser());
-  }
   media_list_->set_media_text(condition);
 }
 
@@ -67,11 +61,8 @@
 
 bool CSSMediaRule::EvaluateConditionValueAndReturnIfChanged(
     const math::Size& viewport_size) {
-  bool condition_value = true;
-  if (media_list_) {
-    condition_value = media_list_->EvaluateConditionValue(viewport_size);
-  }
-  return SetConditionValueAndTestIfChanged(condition_value);
+  return SetConditionValueAndTestIfChanged(
+      media_list_->EvaluateConditionValue(viewport_size));
 }
 
 void CSSMediaRule::AttachToCSSStyleSheet(CSSStyleSheet* style_sheet) {
diff --git a/src/cobalt/cssom/css_media_rule.h b/src/cobalt/cssom/css_media_rule.h
index ab923ab..4515046 100644
--- a/src/cobalt/cssom/css_media_rule.h
+++ b/src/cobalt/cssom/css_media_rule.h
@@ -37,7 +37,6 @@
 //   https://www.w3.org/TR/cssom/#the-cssmediarule-interface
 class CSSMediaRule : public CSSConditionRule {
  public:
-  CSSMediaRule();
   CSSMediaRule(const scoped_refptr<MediaList>& media_list,
                const scoped_refptr<CSSRuleList>& css_rule_list);
 
diff --git a/src/cobalt/cssom/css_rule.h b/src/cobalt/cssom/css_rule.h
index 6ca98a9..bdad21b 100644
--- a/src/cobalt/cssom/css_rule.h
+++ b/src/cobalt/cssom/css_rule.h
@@ -72,7 +72,16 @@
   void set_parent_style_sheet(CSSStyleSheet *parent_style_sheet);
 
   int index() const { return index_; }
-  void set_index(int index) { index_ = index; }
+
+  // This may be overridden for derived classes representing groups of rules
+  // such that when the parent rule's index is updated, the children's rules
+  // are also updated.
+  virtual void SetIndex(int index) { index_ = index; }
+
+  // Returns how many indices this rule consumes within its parent rule list.
+  // It is useful to override this value for rule groups such that each inner
+  // rule is represented as an index within all its parents.
+  virtual int IndexWidth() const { return 1; }
 
   virtual void Accept(CSSRuleVisitor *visitor) = 0;
   virtual void AttachToCSSStyleSheet(CSSStyleSheet *style_sheet) = 0;
@@ -86,7 +95,7 @@
   virtual ~CSSRule() {}
 
  private:
-  int index_;
+  int index_ = 0;
   base::WeakPtr<CSSRule> parent_rule_;
   base::WeakPtr<CSSStyleSheet> parent_style_sheet_;
 
diff --git a/src/cobalt/cssom/css_rule_list.cc b/src/cobalt/cssom/css_rule_list.cc
index 46fb56e..0f1de29 100644
--- a/src/cobalt/cssom/css_rule_list.cc
+++ b/src/cobalt/cssom/css_rule_list.cc
@@ -82,7 +82,8 @@
     css_rule->AttachToCSSStyleSheet(parent_css_style_sheet_);
     parent_css_style_sheet_->OnCSSMutation();
   }
-  css_rule->set_index(static_cast<int>(css_rules_.size()));
+  css_rule->SetIndex(next_index_);
+  next_index_ += css_rule->IndexWidth();
   css_rules_.push_back(css_rule);
 }
 
diff --git a/src/cobalt/cssom/css_rule_list.h b/src/cobalt/cssom/css_rule_list.h
index 8e883cc..796be3f 100644
--- a/src/cobalt/cssom/css_rule_list.h
+++ b/src/cobalt/cssom/css_rule_list.h
@@ -73,6 +73,8 @@
   CSSRules css_rules_;
   CSSStyleSheet* parent_css_style_sheet_;
 
+  int next_index_ = 0;
+
   DISALLOW_COPY_AND_ASSIGN(CSSRuleList);
 };
 
diff --git a/src/cobalt/cssom/css_rule_list_test.cc b/src/cobalt/cssom/css_rule_list_test.cc
index cbeca06..0feebf2 100644
--- a/src/cobalt/cssom/css_rule_list_test.cc
+++ b/src/cobalt/cssom/css_rule_list_test.cc
@@ -18,6 +18,7 @@
 #include "cobalt/cssom/css_media_rule.h"
 #include "cobalt/cssom/css_rule_style_declaration.h"
 #include "cobalt/cssom/css_style_rule.h"
+#include "cobalt/cssom/media_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -60,7 +61,8 @@
 
 TEST(CSSRuleListTest, AppendCSSRuleShouldTakeCSSMediaRule) {
   scoped_refptr<CSSRuleList> rule_list = new CSSRuleList();
-  scoped_refptr<CSSMediaRule> rule = new CSSMediaRule();
+  scoped_refptr<CSSMediaRule> rule =
+      new CSSMediaRule(new MediaList(), new CSSRuleList());
   rule_list->AppendCSSRule(rule);
 
   ASSERT_EQ(1, rule_list->length());
diff --git a/src/cobalt/cssom/css_rule_visitor_test.cc b/src/cobalt/cssom/css_rule_visitor_test.cc
index 21933f9..48b4b3a 100644
--- a/src/cobalt/cssom/css_rule_visitor_test.cc
+++ b/src/cobalt/cssom/css_rule_visitor_test.cc
@@ -21,6 +21,7 @@
 #include "cobalt/cssom/css_keyframes_rule.h"
 #include "cobalt/cssom/css_media_rule.h"
 #include "cobalt/cssom/css_style_rule.h"
+#include "cobalt/cssom/media_list.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -45,7 +46,8 @@
 }
 
 TEST(CSSRuleVisitorTest, VisitsCSSMediaRule) {
-  scoped_refptr<CSSMediaRule> rule = new CSSMediaRule();
+  scoped_refptr<CSSMediaRule> rule =
+      new CSSMediaRule(new MediaList(), new CSSRuleList());
   MockCSSRuleVisitor mock_visitor;
   EXPECT_CALL(mock_visitor, VisitCSSMediaRule(rule.get()));
   rule->Accept(&mock_visitor);
diff --git a/src/cobalt/cssom/css_style_sheet_test.cc b/src/cobalt/cssom/css_style_sheet_test.cc
index eedaa30..00abb91 100644
--- a/src/cobalt/cssom/css_style_sheet_test.cc
+++ b/src/cobalt/cssom/css_style_sheet_test.cc
@@ -111,7 +111,8 @@
   scoped_refptr<CSSRuleList> rule_list =
       css_style_sheet_->css_rules_same_origin();
   // A CSSMediaRule with no expression always evaluates to true.
-  scoped_refptr<CSSMediaRule> rule = new CSSMediaRule();
+  scoped_refptr<CSSMediaRule> rule =
+      new CSSMediaRule(new MediaList(), new CSSRuleList());
 
   EXPECT_CALL(mutation_observer_, OnCSSMutation()).Times(0);
   css_style_sheet_->EvaluateMediaRules(math::Size(1920, 1080));
@@ -131,7 +132,8 @@
   scoped_refptr<MediaQuery> media_query(new MediaQuery(false));
   scoped_refptr<MediaList> media_list(new MediaList());
   media_list->Append(media_query);
-  scoped_refptr<CSSMediaRule> rule = new CSSMediaRule(media_list, NULL);
+  scoped_refptr<CSSMediaRule> rule =
+      new CSSMediaRule(media_list, new CSSRuleList());
   scoped_refptr<CSSRuleList> rule_list =
       css_style_sheet_->css_rules_same_origin();
 
@@ -159,7 +161,8 @@
       new MediaQuery(true, media_features.Pass()));
   scoped_refptr<MediaList> media_list(new MediaList());
   media_list->Append(media_query);
-  scoped_refptr<CSSMediaRule> rule = new CSSMediaRule(media_list, NULL);
+  scoped_refptr<CSSMediaRule> rule =
+      new CSSMediaRule(media_list, new CSSRuleList());
 
   // This should result in a call to OnCSSMutation(), because a media rule is
   // added to the style sheet.
diff --git a/src/cobalt/cssom/media_list.cc b/src/cobalt/cssom/media_list.cc
index e0931b9..991791e 100644
--- a/src/cobalt/cssom/media_list.cc
+++ b/src/cobalt/cssom/media_list.cc
@@ -78,6 +78,11 @@
 }
 
 bool MediaList::EvaluateConditionValue(const math::Size& viewport_size) {
+  if (media_queries_.empty()) {
+    // A CSSMediaRule with no expressions always evaluates to true.
+    return true;
+  }
+
   for (MediaQueries::iterator it = media_queries_.begin();
        it != media_queries_.end(); ++it) {
     if ((*it)->EvaluateConditionValue(viewport_size)) {
diff --git a/src/cobalt/dom/custom_event_test.cc b/src/cobalt/dom/custom_event_test.cc
index 73b4007..48082a5 100644
--- a/src/cobalt/dom/custom_event_test.cc
+++ b/src/cobalt/dom/custom_event_test.cc
@@ -53,8 +53,8 @@
 class CustomEventTest : public ::testing::Test {
  public:
   CustomEventTest()
-      : environment_settings_(new script::EnvironmentSettings),
-        message_loop_(MessageLoop::TYPE_DEFAULT),
+      : message_loop_(MessageLoop::TYPE_DEFAULT),
+        environment_settings_(new script::EnvironmentSettings),
         css_parser_(css_parser::Parser::Create()),
         dom_parser_(new dom_parser::Parser(mock_error_callback_)),
         fetcher_factory_(new loader::FetcherFactory(NULL)),
@@ -87,11 +87,10 @@
   bool EvaluateScript(const std::string& js_code, std::string* result);
 
  private:
-  scoped_ptr<script::JavaScriptEngine> engine_;
-  scoped_refptr<script::GlobalEnvironment> global_environment_;
-
-  const scoped_ptr<script::EnvironmentSettings> environment_settings_;
   MessageLoop message_loop_;
+  scoped_ptr<script::JavaScriptEngine> engine_;
+  const scoped_ptr<script::EnvironmentSettings> environment_settings_;
+  scoped_refptr<script::GlobalEnvironment> global_environment_;
   MockErrorCallback mock_error_callback_;
   scoped_ptr<css_parser::Parser> css_parser_;
   scoped_ptr<dom_parser::Parser> dom_parser_;
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index 0fb768c..93ad5b6 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -214,6 +214,7 @@
 scoped_refptr<Element> Document::CreateElementNS(
     const std::string& namespace_uri, const std::string& local_name) {
   // TODO: Implement namespaces, if we actually need this.
+  NOTIMPLEMENTED();
   UNREFERENCED_PARAMETER(namespace_uri);
   return CreateElement(local_name);
 }
diff --git a/src/cobalt/dom/element.cc b/src/cobalt/dom/element.cc
index d774257..933bd32 100644
--- a/src/cobalt/dom/element.cc
+++ b/src/cobalt/dom/element.cc
@@ -114,6 +114,22 @@
 
 bool Element::HasAttributes() const { return !attribute_map_.empty(); }
 
+base::optional<std::string> Element::GetAttributeNS(
+    const std::string& namespace_uri, const std::string& name) const {
+  // TODO: Implement namespaces, if we actually need this.
+  NOTIMPLEMENTED();
+  UNREFERENCED_PARAMETER(namespace_uri);
+  return GetAttribute(name);
+}
+
+bool Element::HasAttributeNS(const std::string& namespace_uri,
+                             const std::string& name) const {
+  // TODO: Implement namespaces, if we actually need this.
+  NOTIMPLEMENTED();
+  UNREFERENCED_PARAMETER(namespace_uri);
+  return HasAttribute(name);
+}
+
 scoped_refptr<NamedNodeMap> Element::attributes() {
   TRACK_MEMORY_SCOPE("DOM");
   scoped_refptr<NamedNodeMap> named_node_map = named_node_map_.get();
diff --git a/src/cobalt/dom/element.h b/src/cobalt/dom/element.h
index 60ada5b..eb80f06 100644
--- a/src/cobalt/dom/element.h
+++ b/src/cobalt/dom/element.h
@@ -93,6 +93,11 @@
   void RemoveAttribute(const std::string& name);
   bool HasAttribute(const std::string& name) const;
 
+  base::optional<std::string> GetAttributeNS(const std::string& namespace_uri,
+                                             const std::string& name) const;
+  bool HasAttributeNS(const std::string& namespace_uri,
+                      const std::string& name) const;
+
   scoped_refptr<HTMLCollection> GetElementsByTagName(
       const std::string& local_name) const;
   scoped_refptr<HTMLCollection> GetElementsByClassName(
diff --git a/src/cobalt/dom/element.idl b/src/cobalt/dom/element.idl
index a97273f..f6a0ca4 100644
--- a/src/cobalt/dom/element.idl
+++ b/src/cobalt/dom/element.idl
@@ -27,6 +27,8 @@
   void setAttribute(DOMString name, DOMString value);
   void removeAttribute(DOMString name);
   boolean hasAttribute(DOMString name);
+  boolean hasAttributeNS(DOMString namespace_uri, DOMString localName);
+  DOMString? getAttributeNS(DOMString namespace_uri, DOMString name);
   HTMLCollection getElementsByTagName(DOMString localName);
   HTMLCollection getElementsByClassName(DOMString classNames);
 };
diff --git a/src/cobalt/dom/element_test.cc b/src/cobalt/dom/element_test.cc
index 03328eb..e8a0017 100644
--- a/src/cobalt/dom/element_test.cc
+++ b/src/cobalt/dom/element_test.cc
@@ -25,6 +25,7 @@
 #include "cobalt/dom/dom_stat_tracker.h"
 #include "cobalt/dom/dom_token_list.h"
 #include "cobalt/dom/global_stats.h"
+#include "cobalt/dom/html_div_element.h"
 #include "cobalt/dom/html_element.h"
 #include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/named_node_map.h"
@@ -554,12 +555,39 @@
           ->AsElement();
   element_b2->AppendChild(new Text(document_, "Text"));
 
+  element_a->AppendChild(new Text(document_, "\n  "));
+
+  // Start specifically testing that the "style" attribute is serialized
+  // correctly.
+  scoped_refptr<HTMLElement> div_element_1 =
+      element_a->AppendChild(new HTMLDivElement(document_))->AsElement()
+          ->AsHTMLElement();
+  div_element_1->SetAttribute("style", "height: 20px;");
+
+  element_a->AppendChild(new Text(document_, "\n  "));
+
+  scoped_refptr<HTMLElement> div_element_2 =
+      element_a->AppendChild(new HTMLDivElement(document_))->AsElement()
+          ->AsHTMLElement();
+  div_element_2->AsHTMLElement()->style()->set_width("10px", nullptr);
+
+  element_a->AppendChild(new Text(document_, "\n  "));
+
+  scoped_refptr<HTMLElement> div_element_3 =
+      element_a->AppendChild(new HTMLDivElement(document_))->AsElement()
+          ->AsHTMLElement();
+  div_element_3->SetAttribute("style", "height: 20px;");
+  div_element_3->AsHTMLElement()->style()->set_width("10px", nullptr);
+
   element_a->AppendChild(new Text(document_, "\n"));
 
   const char kExpectedHTML[] =
       "<root><element_a key=\"value\">\n"
       "  <element_b1 just_key></element_b1>\n"
       "  <element_b2>Text</element_b2>\n"
+      "  <div style=\"height: 20px;\"></div>\n"
+      "  <div style=\"width: 10px;\"></div>\n"
+      "  <div style=\"height: 20px; width: 10px;\"></div>\n"
       "</element_a></root>";
   EXPECT_EQ(kExpectedHTML, root->outer_html(NULL));
 
diff --git a/src/cobalt/dom/eme/media_key_session.cc b/src/cobalt/dom/eme/media_key_session.cc
index 35b4abf..b3543ec 100644
--- a/src/cobalt/dom/eme/media_key_session.cc
+++ b/src/cobalt/dom/eme/media_key_session.cc
@@ -27,72 +27,17 @@
 #include "cobalt/script/array_buffer_view.h"
 #include "cobalt/script/script_value_factory.h"
 
-// TODO: Remove this workaround.
-#include "cobalt/network/network_module.h"
-
 namespace cobalt {
 namespace dom {
 namespace eme {
 
-// TODO: Remove this workaround.
-namespace {
-
-const char kIndividualizationUrlPrefix[] =
-    "https://www.googleapis.com/certificateprovisioning/v1/devicecertificates/"
-    "create?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE&signedRequest=";
-
-}  // namespace
-
-MediaKeySession::IndividualizationFetcherDelegate::
-    IndividualizationFetcherDelegate(MediaKeySession* media_key_session)
-    : media_key_session_(media_key_session) {
-  DCHECK(media_key_session_);
-}
-
-void MediaKeySession::IndividualizationFetcherDelegate::OnURLFetchDownloadData(
-    const net::URLFetcher* source, scoped_ptr<std::string> download_data) {
-  UNREFERENCED_PARAMETER(source);
-  if (download_data) {
-    response_.insert(response_.end(), download_data->begin(),
-                     download_data->end());
-  }
-}
-
-void MediaKeySession::IndividualizationFetcherDelegate::OnURLFetchComplete(
-    const net::URLFetcher* source) {
-  UNREFERENCED_PARAMETER(source);
-  media_key_session_->OnIndividualizationResponse(response_);
-}
-
-void MediaKeySession::OnIndividualizationResponse(const std::string& response) {
-  DCHECK(invidualization_fetcher_);
-  invidualization_fetcher_.reset();
-
-  if (response.empty()) {
-    // TODO: Add error handling if we are going to keep this workaround.
-    return;
-  }
-
-  script::Handle<script::Promise<void>> promise =
-      script_value_factory_->CreateBasicPromise<void>();
-  drm_system_session_->Update(
-      reinterpret_cast<const uint8*>(response.data()),
-      static_cast<int>(response.size()),
-      base::Bind(&MediaKeySession::OnSessionUpdated, base::AsWeakPtr(this),
-                 base::Owned(new VoidPromiseValue::Reference(this, promise))),
-      base::Bind(&MediaKeySession::OnSessionDidNotUpdate, base::AsWeakPtr(this),
-                 base::Owned(new VoidPromiseValue::Reference(this, promise))));
-}
-
 // See step 3.1 of
 // https://www.w3.org/TR/encrypted-media/#dom-mediakeys-createsession.
 MediaKeySession::MediaKeySession(
     const scoped_refptr<media::DrmSystem>& drm_system,
     script::ScriptValueFactory* script_value_factory,
     const ClosedCallback& closed_callback)
-    : // TODO: Remove this workaround.
-      ALLOW_THIS_IN_INITIALIZER_LIST(invidualization_fetcher_delegate_(this)),
-      ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
+    : ALLOW_THIS_IN_INITIALIZER_LIST(event_queue_(this)),
       drm_system_(drm_system),
       drm_system_session_(drm_system->CreateSession(
 #if SB_HAS(DRM_KEY_STATUSES)
@@ -332,32 +277,6 @@
           kMediaKeyMessageTypeLicenseRelease);
       break;
     case kSbDrmSessionRequestTypeIndividualizationRequest:
-      // TODO: Remove this workaround.
-      // Note that |message_size| will never be 0, the if statement serves the
-      // purpose to keep the statements after it uncommented without triggering
-      // any build error.
-      if (message_size != 0) {
-        DCHECK(!invidualization_fetcher_);
-
-        std::string request(
-            reinterpret_cast<const char*>(message.get()),
-            reinterpret_cast<const char*>(message.get()) + message_size);
-        GURL request_url(kIndividualizationUrlPrefix + request);
-        invidualization_fetcher_.reset(
-            net::URLFetcher::Create(request_url, net::URLFetcher::POST,
-                                    &invidualization_fetcher_delegate_));
-        invidualization_fetcher_->SetRequestContext(
-            dom_settings->network_module()->url_request_context_getter());
-        // Don't cache the response, send it to us in OnURLFetchDownloadData().
-        invidualization_fetcher_->DiscardResponse();
-        // Handle redirect automatically.
-        invidualization_fetcher_->SetAutomaticallyRetryOn5xx(true);
-        invidualization_fetcher_->SetStopOnRedirect(false);
-        // TODO: Handle CORS properly if we are going to keep this workaround.
-        invidualization_fetcher_->Start();
-
-        return;
-      }
       media_key_message_event_init.set_message_type(
           kMediaKeyMessageTypeIndividualizationRequest);
       break;
diff --git a/src/cobalt/dom/eme/media_key_session.h b/src/cobalt/dom/eme/media_key_session.h
index 62863e2..73cccbc 100644
--- a/src/cobalt/dom/eme/media_key_session.h
+++ b/src/cobalt/dom/eme/media_key_session.h
@@ -31,10 +31,6 @@
 #include "cobalt/script/script_value_factory.h"
 #include "starboard/drm.h"
 
-// TODO: Remove this workaround.
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_fetcher_delegate.h"
-
 namespace cobalt {
 namespace dom {
 namespace eme {
@@ -72,24 +68,6 @@
   void TraceMembers(script::Tracer* tracer) override;
 
  private:
-  // TODO: Remove this workaround.
-  class IndividualizationFetcherDelegate : public net::URLFetcherDelegate {
-   public:
-    explicit IndividualizationFetcherDelegate(
-        MediaKeySession* media_key_session);
-    void OnURLFetchDownloadData(const net::URLFetcher* source,
-                                scoped_ptr<std::string> download_data) override;
-    void OnURLFetchComplete(const net::URLFetcher* source) override;
-    bool ShouldSendDownloadData() override { return true; }
-
-   private:
-    MediaKeySession* media_key_session_;
-    std::string response_;
-  };
-  IndividualizationFetcherDelegate invidualization_fetcher_delegate_;
-  scoped_ptr<net::URLFetcher> invidualization_fetcher_;
-  void OnIndividualizationResponse(const std::string& response);
-
   ~MediaKeySession() override;
 
   void OnSessionUpdateRequestGenerated(
diff --git a/src/cobalt/dom/error_event_test.cc b/src/cobalt/dom/error_event_test.cc
index 3ca9ae3..483ba90 100644
--- a/src/cobalt/dom/error_event_test.cc
+++ b/src/cobalt/dom/error_event_test.cc
@@ -53,8 +53,8 @@
 class ErrorEventTest : public ::testing::Test {
  public:
   ErrorEventTest()
-      : environment_settings_(new script::EnvironmentSettings),
-        message_loop_(MessageLoop::TYPE_DEFAULT),
+      : message_loop_(MessageLoop::TYPE_DEFAULT),
+        environment_settings_(new script::EnvironmentSettings),
         css_parser_(css_parser::Parser::Create()),
         dom_parser_(new dom_parser::Parser(mock_error_callback_)),
         fetcher_factory_(new loader::FetcherFactory(NULL)),
@@ -89,11 +89,10 @@
   bool EvaluateScript(const std::string& js_code, std::string* result);
 
  private:
-  scoped_ptr<script::JavaScriptEngine> engine_;
-  scoped_refptr<script::GlobalEnvironment> global_environment_;
-
-  const scoped_ptr<script::EnvironmentSettings> environment_settings_;
   MessageLoop message_loop_;
+  scoped_ptr<script::JavaScriptEngine> engine_;
+  const scoped_ptr<script::EnvironmentSettings> environment_settings_;
+  scoped_refptr<script::GlobalEnvironment> global_environment_;
   MockErrorCallback mock_error_callback_;
   scoped_ptr<css_parser::Parser> css_parser_;
   scoped_ptr<dom_parser::Parser> dom_parser_;
diff --git a/src/cobalt/dom/global_event_handlers.idl b/src/cobalt/dom/global_event_handlers.idl
index 9f5ecc8..5e1ab6a 100644
--- a/src/cobalt/dom/global_event_handlers.idl
+++ b/src/cobalt/dom/global_event_handlers.idl
@@ -18,7 +18,7 @@
 interface GlobalEventHandlers {
   attribute EventHandler onblur;
   attribute EventHandler onclick;
-  attribute OnErrorEventListener onerror;
+  attribute OnErrorEventHandler onerror;
   attribute EventHandler onfocus;
 
   attribute EventHandler onkeydown;
diff --git a/src/cobalt/dom/html_media_element.cc b/src/cobalt/dom/html_media_element.cc
index 05f3636..ba28f7b 100644
--- a/src/cobalt/dom/html_media_element.cc
+++ b/src/cobalt/dom/html_media_element.cc
@@ -1124,6 +1124,11 @@
     MediaEngineError(new MediaError(
         MediaError::kMediaErrDecode,
         message.empty() ? "Media loading failed with decode error." : message));
+  } else if (error == WebMediaPlayer::kNetworkStateCapabilityChangedError) {
+    MediaEngineError(new MediaError(
+        MediaError::kMediaErrCapabilityChanged,
+        message.empty() ? "Media loading failed with capability changed error."
+                        : message));
   } else if ((error == WebMediaPlayer::kNetworkStateFormatError ||
               error == WebMediaPlayer::kNetworkStateNetworkError) &&
              load_state_ == kLoadingFromSrcAttr) {
@@ -1354,6 +1359,7 @@
     case WebMediaPlayer::kNetworkStateFormatError:
     case WebMediaPlayer::kNetworkStateNetworkError:
     case WebMediaPlayer::kNetworkStateDecodeError:
+    case WebMediaPlayer::kNetworkStateCapabilityChangedError:
       NOTREACHED() << "Passed SetNetworkState an error state";
       break;
   }
@@ -1365,6 +1371,7 @@
     case WebMediaPlayer::kNetworkStateFormatError:
     case WebMediaPlayer::kNetworkStateNetworkError:
     case WebMediaPlayer::kNetworkStateDecodeError:
+    case WebMediaPlayer::kNetworkStateCapabilityChangedError:
       MediaLoadingFailed(state, message);
       break;
     case WebMediaPlayer::kNetworkStateEmpty:
diff --git a/src/cobalt/dom/media_error.h b/src/cobalt/dom/media_error.h
index d448be8..45b2538 100644
--- a/src/cobalt/dom/media_error.h
+++ b/src/cobalt/dom/media_error.h
@@ -36,6 +36,7 @@
     kMediaErrDecode = 3,
     kMediaErrSrcNotSupported = 4,
     kMediaErrEncrypted = 5,
+    kMediaErrCapabilityChanged = 1000,
   };
 
   // Custom, not in any spec.
diff --git a/src/cobalt/dom/media_error.idl b/src/cobalt/dom/media_error.idl
index 5913592..d188e25 100644
--- a/src/cobalt/dom/media_error.idl
+++ b/src/cobalt/dom/media_error.idl
@@ -20,6 +20,9 @@
   const unsigned short MEDIA_ERR_DECODE = 3;
   const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
   const unsigned short MEDIA_ERR_ENCRYPTED = 5;
+  // The underlying playback capability has changed, the app should treat this
+  // as a transient error and retry playback.
+  const unsigned short MEDIA_ERR_CAPABILITY_CHANGED = 1000;
 
   readonly attribute unsigned short code;
   readonly attribute DOMString message;
diff --git a/src/cobalt/dom/serializer.cc b/src/cobalt/dom/serializer.cc
index b7952a3..16c06f3 100644
--- a/src/cobalt/dom/serializer.cc
+++ b/src/cobalt/dom/serializer.cc
@@ -31,24 +31,35 @@
 namespace dom {
 namespace {
 
+const char kStyleAttributeName[] = "style";
+
 void WriteAtttributes(const scoped_refptr<const Element>& element,
                       std::ostream* out_stream) {
-  if (element->HasAttributes()) {
-    const Element::AttributeMap& attributes = element->attribute_map();
-    typedef std::map<std::string, std::string> SortedAttributeMap;
-    SortedAttributeMap sorted_attribute_map;
-    sorted_attribute_map.insert(attributes.begin(), attributes.end());
+  const Element::AttributeMap& attributes = element->attribute_map();
+  typedef std::map<std::string, std::string> SortedAttributeMap;
+  SortedAttributeMap sorted_attribute_map;
+  sorted_attribute_map.insert(attributes.begin(), attributes.end());
 
-    for (SortedAttributeMap::const_iterator iter = sorted_attribute_map.begin();
-         iter != sorted_attribute_map.end(); ++iter) {
-      const std::string& name = iter->first;
-      const std::string& value = iter->second;
+  {
+    // The "style" attribute is handled specially because HTMLElements store
+    // it explicitly as a cssom::CSSDeclaredStyleDeclaration structure instead
+    // of as an attribute string, so we add it (or replace it) explicitly in the
+    // attribute map.
+    base::optional<std::string> style_attribute = element->GetStyleAttribute();
+    if (style_attribute && !style_attribute->empty()) {
+      sorted_attribute_map[kStyleAttributeName] = std::move(*style_attribute);
+    }
+  }
 
-      *out_stream << " " << name;
-      if (!value.empty()) {
-        *out_stream << "="
-                    << "\"" << value << "\"";
-      }
+  for (SortedAttributeMap::const_iterator iter = sorted_attribute_map.begin();
+       iter != sorted_attribute_map.end(); ++iter) {
+    const std::string& name = iter->first;
+    const std::string& value = iter->second;
+
+    *out_stream << " " << name;
+    if (!value.empty()) {
+      *out_stream << "="
+                  << "\"" << value << "\"";
     }
   }
 }
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index dd833d6..1ae118e 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -420,7 +420,7 @@
   }
 }
 
-void Window::DestroyTimers() { window_timers_.reset(); }
+void Window::DestroyTimers() { window_timers_->DisableCallbacks(); }
 
 scoped_refptr<Storage> Window::local_storage() const { return local_storage_; }
 
diff --git a/src/cobalt/dom/window_timers.cc b/src/cobalt/dom/window_timers.cc
index a762d47..265b465 100644
--- a/src/cobalt/dom/window_timers.cc
+++ b/src/cobalt/dom/window_timers.cc
@@ -35,11 +35,16 @@
     return 0;
   }
 
-  scoped_ptr<base::Timer> timer(new base::OneShotTimer<TimerInfo>());
-  timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
-               base::Bind(&WindowTimers::RunTimerCallback,
-                          base::Unretained(this), handle));
-  timers_[handle] = new TimerInfo(owner_, timer.Pass(), handler);
+  if (callbacks_active_) {
+    scoped_ptr<base::Timer> timer(new base::OneShotTimer<TimerInfo>());
+    timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
+                 base::Bind(&WindowTimers::RunTimerCallback,
+                            base::Unretained(this), handle));
+    timers_[handle] = new TimerInfo(owner_, timer.Pass(), handler);
+  } else {
+    timers_[handle] = nullptr;
+  }
+
   return handle;
 }
 
@@ -54,11 +59,16 @@
     return 0;
   }
 
-  scoped_ptr<base::Timer> timer(new base::RepeatingTimer<TimerInfo>());
-  timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
-               base::Bind(&WindowTimers::RunTimerCallback,
-                          base::Unretained(this), handle));
-  timers_[handle] = new TimerInfo(owner_, timer.Pass(), handler);
+  if (callbacks_active_) {
+    scoped_ptr<base::Timer> timer(new base::RepeatingTimer<TimerInfo>());
+    timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout),
+                 base::Bind(&WindowTimers::RunTimerCallback,
+                            base::Unretained(this), handle));
+    timers_[handle] = new TimerInfo(owner_, timer.Pass(), handler);
+  } else {
+    timers_[handle] = nullptr;
+  }
+
   return handle;
 }
 
@@ -66,6 +76,14 @@
 
 void WindowTimers::ClearAllIntervalsAndTimeouts() { timers_.clear(); }
 
+void WindowTimers::DisableCallbacks() {
+  callbacks_active_ = false;
+  // Immediately cancel any pending timers.
+  for (auto& timer_entry : timers_) {
+    timer_entry.second = nullptr;
+  }
+}
+
 int WindowTimers::GetFreeTimerHandle() {
   int next_timer_index = current_timer_index_;
   while (true) {
@@ -88,6 +106,8 @@
 
 void WindowTimers::RunTimerCallback(int handle) {
   TRACE_EVENT0("cobalt::dom", "WindowTimers::RunTimerCallback");
+  DCHECK(callbacks_active_)
+      << "All timer callbacks should have already been cancelled.";
   Timers::iterator timer = timers_.find(handle);
   DCHECK(timer != timers_.end());
 
diff --git a/src/cobalt/dom/window_timers.h b/src/cobalt/dom/window_timers.h
index fff7e3c..9021a9b 100644
--- a/src/cobalt/dom/window_timers.h
+++ b/src/cobalt/dom/window_timers.h
@@ -44,6 +44,12 @@
 
   void ClearAllIntervalsAndTimeouts();
 
+  // When called, it will irreversibly put the WindowTimers object in an
+  // inactive state where timer callbacks are ignored.  This is useful when
+  // we're in the process of shutting down and wish to drain the JavaScript
+  // event queue without adding more on to the end of it.
+  void DisableCallbacks();
+
  private:
   class TimerInfo : public base::RefCounted<TimerInfo> {
    public:
@@ -75,6 +81,10 @@
   int current_timer_index_;
   script::Wrappable* const owner_;
 
+  // Set to false when we're about to shutdown, to ensure that no new JavaScript
+  // is fired as we are waiting for it to drain.
+  bool callbacks_active_ = true;
+
   DISALLOW_COPY_AND_ASSIGN(WindowTimers);
 };
 
diff --git a/src/cobalt/layout_tests/layout_tests.cc b/src/cobalt/layout_tests/layout_tests.cc
index bfb3710..a4f0a03 100644
--- a/src/cobalt/layout_tests/layout_tests.cc
+++ b/src/cobalt/layout_tests/layout_tests.cc
@@ -157,6 +157,11 @@
 INSTANTIATE_TEST_CASE_P(
     CSSImages3LayoutTests, LayoutTest,
     ::testing::ValuesIn(EnumerateLayoutTests("css3-images")));
+// Custom CSS Media Queries (https://www.w3.org/TR/css3-mediaqueries/) test
+// cases.
+INSTANTIATE_TEST_CASE_P(
+    CSSMediaQueriesLayoutTests, LayoutTest,
+    ::testing::ValuesIn(EnumerateLayoutTests("css3-mediaqueries")));
 // Custom CSS Text (https://www.w3.org/TR/css-text-3/) test cases.
 INSTANTIATE_TEST_CASE_P(
     CSSText3LayoutTests, LayoutTest,
diff --git a/src/cobalt/layout_tests/testdata/cobalt/window-onerror.html b/src/cobalt/layout_tests/testdata/cobalt/window-onerror.html
index 20bf0b7..399068a 100644
--- a/src/cobalt/layout_tests/testdata/cobalt/window-onerror.html
+++ b/src/cobalt/layout_tests/testdata/cobalt/window-onerror.html
@@ -27,6 +27,12 @@
 }
 
 let windowOnErrorWasCalled = false;
+
+// No need to set this to null, but there was a regression at one point where
+// doing so would result in an erroneous JS error, so add this line in to get
+// some extra test coverage.
+window.onerror = null;
+
 window.onerror = (message, filename, lineno, colno, error) => {
   // We allow anything that ends with "myCoolMessage" to pass, Chrome/Firefox behavior differs here
   // (Chrome: "Uncaught Error: myCoolMessage", Firefox: "Error: myCoolMessage").
@@ -34,7 +40,7 @@
   // Allow any filename that ends with "window-onerror.html", in order to not couple too heavily to
   // the implementation of layout_tests.
   expect(/.*window-onerror.html/.test(filename), filename);
-  expect(lineno === 83, lineno);
+  expect(lineno === 89, lineno);
   // The value of the column number is not standard across major browsers.
   //   Chrome: 1 without devtools open, 7 with devtools open.
   //   Edge: Always 1.
@@ -60,7 +66,7 @@
   expect(/.*myCoolMessage/.test(errorEvent.message), errorEvent.message);
   expect(/.*window-onerror.html/.test(errorEvent.filename),
          errorEvent.filename);
-  expect(errorEvent.lineno === 83, errorEvent.lineno);
+  expect(errorEvent.lineno === 89, errorEvent.lineno);
   expect(errorEvent.colno === 1 || errorEvent.colno === 7 ||
          errorEvent.colno === 18, errorEvent.colno);
   expect(typeof errorEvent.error === 'object', typeof errorEvent.error);
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/bug_style.css b/src/cobalt/layout_tests/testdata/css3-mediaqueries/bug_style.css
new file mode 100644
index 0000000..51a79a6
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/bug_style.css
@@ -0,0 +1,55 @@
+body, html {
+  height: 100%;
+  background-color: white;
+  color: black;
+  min-height: 300px;
+  width: 100%;
+  min-width: 300px;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  font-size: 2.0em;
+  line-height: 1.4em;
+  font-family: Roboto;
+}
+
+#span300 {
+  display: block;
+  width:50px;
+  height:100px;
+  background-color: black;
+}
+
+#span400 {
+  display: block;
+  width:100px;
+  height:50px;
+  background-color: yellow;
+}
+
+
+/* Responsive design. Put this at the bottom of this file. */
+@media screen and (min-height: 300px) {
+  body, html {
+    background-color: red;
+    font-size: 3.0em;
+  }
+  #span300 {
+    display: block;
+  }
+  #span400 {
+    display: none;
+  }
+}
+
+@media screen and (min-height: 400px) {
+  body, html {
+    background-color: blue;
+  }
+  #span400 {
+    display: block;
+  }
+  #span300 {
+    display: none;
+  }
+}
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/layout_tests.txt b/src/cobalt/layout_tests/testdata/css3-mediaqueries/layout_tests.txt
new file mode 100644
index 0000000..3e523a2
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/layout_tests.txt
@@ -0,0 +1,3 @@
+media_query_rule_precedence_200:200x200
+media_query_rule_precedence_300:300x300
+media_query_rule_precedence_400:400x400
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200-expected.png b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200-expected.png
new file mode 100644
index 0000000..9b4d030
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200.html b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200.html
new file mode 100644
index 0000000..08fb06a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_200.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Cascading Media Queries Rule Precedence</title>
+  <link rel='stylesheet' href='bug_style.css' type='text/css'>
+</head>
+
+<body>
+  <span id="span400"></span>
+  <span id="span300"></span>
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300-expected.png b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300-expected.png
new file mode 100644
index 0000000..5f234e0
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300.html b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300.html
new file mode 100644
index 0000000..08fb06a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_300.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Cascading Media Queries Rule Precedence</title>
+  <link rel='stylesheet' href='bug_style.css' type='text/css'>
+</head>
+
+<body>
+  <span id="span400"></span>
+  <span id="span300"></span>
+</body>
+</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400-expected.png b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400-expected.png
new file mode 100644
index 0000000..60e6471
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400-expected.png
Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400.html b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400.html
new file mode 100644
index 0000000..08fb06a
--- /dev/null
+++ b/src/cobalt/layout_tests/testdata/css3-mediaqueries/media_query_rule_precedence_400.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Cascading Media Queries Rule Precedence</title>
+  <link rel='stylesheet' href='bug_style.css' type='text/css'>
+</head>
+
+<body>
+  <span id="span400"></span>
+  <span id="span300"></span>
+</body>
+</html>
diff --git a/src/cobalt/media/base/drm_system.cc b/src/cobalt/media/base/drm_system.cc
index bc63275..5cf1eb6 100644
--- a/src/cobalt/media/base/drm_system.cc
+++ b/src/cobalt/media/base/drm_system.cc
@@ -16,6 +16,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/message_loop.h"
 
 namespace cobalt {
 namespace media {
@@ -103,11 +104,9 @@
                                             OnSessionClosedFunc
 #endif  // SB_HAS(DRM_SESSION_CLOSED)
                                             )),  // NOLINT(whitespace/parens)
-      message_loop_(MessageLoop::current()),
+      message_loop_(MessageLoop::current()->message_loop_proxy()),
       ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
-      weak_this_(weak_ptr_factory_.GetWeakPtr()),
-      next_session_update_request_ticket_(0),
-      next_session_update_ticket_(0) {
+      weak_this_(weak_ptr_factory_.GetWeakPtr()) {
   DCHECK_NE(kSbDrmSystemInvalid, wrapped_drm_system_);
 }
 
@@ -122,6 +121,7 @@
 #endif  // SB_HAS(DRM_SESSION_CLOSED)
 #endif  // SB_HAS(DRM_KEY_STATUSES)
     ) {  // NOLINT(whitespace/parens)
+  DCHECK(message_loop_->BelongsToCurrentThread());
   return make_scoped_ptr(new Session(this
 #if SB_HAS(DRM_KEY_STATUSES)
                                      ,
@@ -136,25 +136,31 @@
 
 #if SB_API_VERSION >= 10
 bool DrmSystem::IsServerCertificateUpdatable() {
+  DCHECK(message_loop_->BelongsToCurrentThread());
   return SbDrmIsServerCertificateUpdatable(wrapped_drm_system_);
 }
 
 void DrmSystem::UpdateServerCertificate(
     const uint8_t* certificate, int certificate_size,
     ServerCertificateUpdatedCallback server_certificate_updated_callback) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
   DCHECK(IsServerCertificateUpdatable());
-  int ticket = next_session_update_request_ticket_++;
+  int ticket = next_ticket_++;
   ticket_to_server_certificate_updated_map_.insert(
       std::make_pair(ticket, server_certificate_updated_callback));
   SbDrmUpdateServerCertificate(wrapped_drm_system_, ticket, certificate,
                                certificate_size);
 }
 #else   // SB_API_VERSION >= 10
-bool DrmSystem::IsServerCertificateUpdatable() { return false; }
+bool DrmSystem::IsServerCertificateUpdatable() {
+  DCHECK(message_loop_->BelongsToCurrentThread());
+  return false;
+}
 
 void DrmSystem::UpdateServerCertificate(
     const uint8_t* certificate, int certificate_size,
     ServerCertificateUpdatedCallback server_certificate_updated_callback) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
   NOTREACHED();
 }
 #endif  // SB_API_VERSION >= 10
@@ -165,6 +171,8 @@
                               session_update_request_generated_callback,
     const SessionUpdateRequestDidNotGenerateCallback&
         session_update_request_did_not_generate_callback) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
+
   // Store the context of the call.
   SessionUpdateRequest session_update_request;
   session_update_request.session = session;
@@ -172,7 +180,7 @@
       session_update_request_generated_callback;
   session_update_request.did_not_generate_callback =
       session_update_request_did_not_generate_callback;
-  int ticket = next_session_update_request_ticket_++;
+  int ticket = next_ticket_++;
   ticket_to_session_update_request_map_.insert(
       std::make_pair(ticket, session_update_request));
 
@@ -184,11 +192,13 @@
     const std::string& session_id, const uint8_t* key, int key_length,
     const SessionUpdatedCallback& session_updated_callback,
     const SessionDidNotUpdateCallback& session_did_not_update_callback) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
+
   // Store the context of the call.
   SessionUpdate session_update;
   session_update.updated_callback = session_updated_callback;
   session_update.did_not_update_callback = session_did_not_update_callback;
-  int ticket = next_session_update_ticket_++;
+  int ticket = next_ticket_++;
   ticket_to_session_update_map_.insert(std::make_pair(ticket, session_update));
 
   SbDrmUpdateSession(wrapped_drm_system_, ticket, key, key_length,
@@ -196,6 +206,8 @@
 }
 
 void DrmSystem::CloseSession(const std::string& session_id) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
+
   id_to_session_map_.erase(session_id);
   SbDrmCloseSession(wrapped_drm_system_, session_id.c_str(), session_id.size());
 }
diff --git a/src/cobalt/media/base/drm_system.h b/src/cobalt/media/base/drm_system.h
index 6896710..e0fc79b 100644
--- a/src/cobalt/media/base/drm_system.h
+++ b/src/cobalt/media/base/drm_system.h
@@ -22,7 +22,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/message_loop.h"
+#include "base/message_loop_proxy.h"
 #include "base/optional.h"
 #include "starboard/drm.h"
 
@@ -272,7 +272,7 @@
 #endif  // SB_API_VERSION >= 10
 
   const SbDrmSystem wrapped_drm_system_;
-  MessageLoop* const message_loop_;
+  scoped_refptr<base::MessageLoopProxy> const message_loop_;
 
   // Factory should only be used to create the initial weak pointer. All
   // subsequent weak pointers are created by copying the initial one. This is
@@ -280,8 +280,8 @@
   base::WeakPtrFactory<DrmSystem> weak_ptr_factory_;
   base::WeakPtr<DrmSystem> weak_this_;
 
+  int next_ticket_ = 0;
   // Supports concurrent calls to |GenerateSessionUpdateRequest|.
-  int next_session_update_request_ticket_;
   TicketToSessionUpdateRequestMap ticket_to_session_update_request_map_;
 
   // Supports spontaneous invocations of |SbDrmSessionUpdateRequestFunc|.
@@ -290,7 +290,6 @@
   TicketToServerCertificateUpdatedMap ticket_to_server_certificate_updated_map_;
 
   // Supports concurrent calls to |Session::Update|.
-  int next_session_update_ticket_;
   TicketToSessionUpdateMap ticket_to_session_update_map_;
 
   DISALLOW_COPY_AND_ASSIGN(DrmSystem);
diff --git a/src/cobalt/media/base/media_log.cc b/src/cobalt/media/base/media_log.cc
index 38a045f..403fe1b 100644
--- a/src/cobalt/media/base/media_log.cc
+++ b/src/cobalt/media/base/media_log.cc
@@ -143,6 +143,8 @@
       return "audio renderer: output device reported an error";
     case AUDIO_RENDERER_ERROR_SPLICE_FAILED:
       return "audio renderer: post-decode audio splicing failed";
+    case PLAYBACK_CAPABILITY_CHANGED:
+      return "pipeline: playback capability changed";
   }
   NOTREACHED();
   return NULL;
diff --git a/src/cobalt/media/base/pipeline_status.h b/src/cobalt/media/base/pipeline_status.h
index 4aa3f0b..79a5d50 100644
--- a/src/cobalt/media/base/pipeline_status.h
+++ b/src/cobalt/media/base/pipeline_status.h
@@ -46,8 +46,11 @@
   AUDIO_RENDERER_ERROR = 19,
   AUDIO_RENDERER_ERROR_SPLICE_FAILED = 20,
 
+  // Transient errors.
+  PLAYBACK_CAPABILITY_CHANGED = 22,
+
   // Must be equal to the largest value ever logged.
-  PIPELINE_STATUS_MAX = PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED,
+  PIPELINE_STATUS_MAX = PLAYBACK_CAPABILITY_CHANGED,
 };
 
 typedef base::Callback<void(PipelineStatus)> PipelineStatusCB;
diff --git a/src/cobalt/media/base/sbplayer_pipeline.cc b/src/cobalt/media/base/sbplayer_pipeline.cc
index 9ef716f..0832b46 100644
--- a/src/cobalt/media/base/sbplayer_pipeline.cc
+++ b/src/cobalt/media/base/sbplayer_pipeline.cc
@@ -1142,18 +1142,28 @@
       ResetAndRunIfNotNull(&error_cb_, PIPELINE_ERROR_NETWORK, message);
       break;
     case kSbPlayerErrorDecode:
+      ResetAndRunIfNotNull(&error_cb_, PIPELINE_ERROR_DECODE, message);
+      break;
 #if SB_API_VERSION >= 10
     case kSbPlayerErrorCapabilityChanged:
 #endif  // SB_API_VERSION >= 10
-      ResetAndRunIfNotNull(&error_cb_, PIPELINE_ERROR_DECODE, message);
+      ResetAndRunIfNotNull(&error_cb_, PLAYBACK_CAPABILITY_CHANGED, message);
       break;
     case kSbPlayerErrorSrcNotSupported:
       ResetAndRunIfNotNull(&error_cb_, DEMUXER_ERROR_COULD_NOT_OPEN, message);
       break;
   }
 #else
-  DCHECK_EQ(error, kSbPlayerErrorDecode);
-  ResetAndRunIfNotNull(&error_cb_, PIPELINE_ERROR_DECODE, message);
+  switch (error) {
+    case kSbPlayerErrorDecode:
+      ResetAndRunIfNotNull(&error_cb_, PIPELINE_ERROR_DECODE, message);
+      break;
+#if SB_API_VERSION >= 10
+    case kSbPlayerErrorCapabilityChanged:
+      ResetAndRunIfNotNull(&error_cb_, PLAYBACK_CAPABILITY_CHANGED, message);
+      break;
+#endif  // SB_API_VERSION >= 10
+  }
 #endif  // SB_HAS(PLAYER_WITH_URL)
 }
 #endif  // SB_HAS(PLAYER_ERROR_MESSAGE)
diff --git a/src/cobalt/media/filters/shell_demuxer.cc b/src/cobalt/media/filters/shell_demuxer.cc
index b9d6b94..5232d1b 100644
--- a/src/cobalt/media/filters/shell_demuxer.cc
+++ b/src/cobalt/media/filters/shell_demuxer.cc
@@ -461,14 +461,9 @@
   // Notify host of each disjoint range.
   host_->OnBufferedTimeRangesChanged(buffered);
 
-  // Post the task with a delay to make the request loop a bit friendly to
-  // other tasks as otherwise IssueNextRequest(), Request(), AllocateBuffer(),
-  // and Download() can form a tight loop on the |blocking_thread_|.
-  const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(5);
-  blocking_thread_.message_loop_proxy()->PostDelayedTask(
+  blocking_thread_.message_loop_proxy()->PostTask(
       FROM_HERE,
-      base::Bind(&ShellDemuxer::IssueNextRequest, base::Unretained(this)),
-      kDelay);
+      base::Bind(&ShellDemuxer::IssueNextRequest, base::Unretained(this)));
 }
 
 void ShellDemuxer::IssueNextRequest() {
diff --git a/src/cobalt/media/player/web_media_player.h b/src/cobalt/media/player/web_media_player.h
index 61a379d..3ca8eb7 100644
--- a/src/cobalt/media/player/web_media_player.h
+++ b/src/cobalt/media/player/web_media_player.h
@@ -45,6 +45,7 @@
     kNetworkStateFormatError,
     kNetworkStateNetworkError,
     kNetworkStateDecodeError,
+    kNetworkStateCapabilityChangedError,
   };
 
   enum ReadyState {
diff --git a/src/cobalt/media/player/web_media_player_impl.cc b/src/cobalt/media/player/web_media_player_impl.cc
index a5ac65f..1920b76 100644
--- a/src/cobalt/media/player/web_media_player_impl.cc
+++ b/src/cobalt/media/player/web_media_player_impl.cc
@@ -739,6 +739,10 @@
           WebMediaPlayer::kNetworkStateDecodeError,
           message.empty() ? "Audio renderer splice failed." : message);
       break;
+    case PLAYBACK_CAPABILITY_CHANGED:
+      SetNetworkError(WebMediaPlayer::kNetworkStateCapabilityChangedError,
+                      message.empty() ? "Capability changed." : message);
+      break;
   }
 }
 
diff --git a/src/cobalt/renderer/rasterizer/egl/draw_object.cc b/src/cobalt/renderer/rasterizer/egl/draw_object.cc
index f45e726..98a095e 100644
--- a/src/cobalt/renderer/rasterizer/egl/draw_object.cc
+++ b/src/cobalt/renderer/rasterizer/egl/draw_object.cc
@@ -205,7 +205,7 @@
   }
   if (corners->bottom_left.IsSquare()) {
     corners->bottom_left.horizontal = 0.0f;
-    corners->bottom_right.horizontal = 0.0f;
+    corners->bottom_left.vertical = 0.0f;
   }
 
   // Ensure corner sizes are non-zero to allow generic handling of square and
diff --git a/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
index 0b00c68..51a4a08 100644
--- a/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
+++ b/src/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
@@ -938,11 +938,20 @@
     const backend::TextureEGL** out_texture,
     math::Matrix3F* out_texcoord_transform,
     math::RectF* out_content_rect) {
+
   // Check whether the node is visible.
   math::RectF mapped_bounds = draw_state_.transform.MapRect(node->GetBounds());
+
+  if (!mapped_bounds.IsExpressibleAsRect()) {
+    DLOG(WARNING) << "Invalid rectangle of " << mapped_bounds.ToString()
+                  << " will not be rendered";
+    return;
+  }
+
   math::RectF rounded_out_bounds = RoundOut(mapped_bounds, 0.0f);
   math::RectF clipped_bounds =
       math::IntersectRects(rounded_out_bounds, draw_state_.scissor);
+
   if (clipped_bounds.IsEmpty()) {
     out_content_rect->SetRect(0.0f, 0.0f, 0.0f, 0.0f);
     return;
diff --git a/src/cobalt/script/v8c/cobalt_platform.cc b/src/cobalt/script/v8c/cobalt_platform.cc
new file mode 100644
index 0000000..fd433af
--- /dev/null
+++ b/src/cobalt/script/v8c/cobalt_platform.cc
@@ -0,0 +1,111 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/script/v8c/cobalt_platform.h"
+
+#include "base/logging.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+CobaltPlatform::MessageLoopMapEntry* CobaltPlatform::FindOrAddMapEntry(
+    v8::Isolate* isolate) {
+  auto iter = message_loop_map_.find(isolate);
+  // Because of the member unique_ptr, we need explicit creation.
+  if (iter == message_loop_map_.end()) {
+    auto new_entry = std::unique_ptr<CobaltPlatform::MessageLoopMapEntry>(
+        new CobaltPlatform::MessageLoopMapEntry());
+    message_loop_map_.emplace(std::make_pair(isolate, std::move(new_entry)));
+  }
+  DCHECK(message_loop_map_[isolate]);
+  return message_loop_map_[isolate].get();
+}
+
+void CobaltPlatform::RegisterIsolateOnThread(v8::Isolate* isolate,
+                                             MessageLoop* message_loop) {
+  base::AutoLock auto_lock(lock_);
+  auto* message_loop_entry = FindOrAddMapEntry(isolate);
+  message_loop_entry->message_loop = message_loop;
+  if (!message_loop) {
+    DLOG(WARNING) << "Isolate is registered without a valid message loop!";
+    return;
+  }
+  std::vector<std::unique_ptr<TaskBeforeRegistration>> task_vec;
+  task_vec.swap(message_loop_entry->tasks_before_registration);
+  DCHECK(message_loop_entry->tasks_before_registration.empty());
+  for (unsigned int i = 0; i < task_vec.size(); ++i) {
+    scoped_ptr<v8::Task> scoped_task(task_vec[i]->task.release());
+    base::TimeDelta delay =
+        std::max(task_vec[i]->target_time - base::TimeTicks::Now(),
+                 base::TimeDelta::FromSeconds(0));
+    message_loop->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&CobaltPlatform::RunV8Task, this, isolate,
+                   base::Passed(&scoped_task)),
+        delay);
+  }
+}
+
+void CobaltPlatform::UnregisterIsolateOnThread(v8::Isolate* isolate) {
+  base::AutoLock auto_lock(lock_);
+  MessageLoopMap::iterator iter = message_loop_map_.find(isolate);
+  if (iter != message_loop_map_.end()) {
+    message_loop_map_.erase(iter);
+  } else {
+    DLOG(WARNING) << "Isolate is not in the map and can not be unregistered.";
+  }
+}
+
+void CobaltPlatform::RunV8Task(v8::Isolate* isolate,
+                               scoped_ptr<v8::Task> task) {
+  {
+    base::AutoLock auto_lock(lock_);
+    MessageLoopMap::iterator iter = message_loop_map_.find(isolate);
+    if (iter == message_loop_map_.end() || !iter->second->message_loop) {
+      DLOG(WARNING) << "V8 foreground task executes after isolate "
+                       "unregistered, aborting.";
+      return;
+    }
+  }
+  task->Run();
+}
+
+void CobaltPlatform::CallOnForegroundThread(v8::Isolate* isolate,
+                                            v8::Task* task) {
+  CallDelayedOnForegroundThread(isolate, task, 0);
+}
+
+void CobaltPlatform::CallDelayedOnForegroundThread(v8::Isolate* isolate,
+                                                   v8::Task* task,
+                                                   double delay_in_seconds) {
+  base::AutoLock auto_lock(lock_);
+  auto* message_loop_entry = FindOrAddMapEntry(isolate);
+  if (message_loop_entry->message_loop != NULL) {
+    scoped_ptr<v8::Task> scoped_task(task);
+    message_loop_entry->message_loop->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&CobaltPlatform::RunV8Task, this, isolate,
+                   base::Passed(&scoped_task)),
+        base::TimeDelta::FromSecondsD(delay_in_seconds));
+  } else {
+    message_loop_map_[isolate]->tasks_before_registration.push_back(
+        std::unique_ptr<TaskBeforeRegistration>(
+            new TaskBeforeRegistration(delay_in_seconds, task)));
+  }
+}
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/v8c/cobalt_platform.h b/src/cobalt/script/v8c/cobalt_platform.h
new file mode 100644
index 0000000..e730277
--- /dev/null
+++ b/src/cobalt/script/v8c/cobalt_platform.h
@@ -0,0 +1,142 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_SCRIPT_V8C_COBALT_PLATFORM_H_
+#define COBALT_SCRIPT_V8C_COBALT_PLATFORM_H_
+
+#include <map>
+#include <memory>
+
+#include "base/memory/ref_counted.h"
+#include "base/message_loop.h"
+#include "base/synchronization/lock.h"
+#include "v8/include/libplatform/libplatform.h"
+#include "v8/include/v8-platform.h"
+#include "v8/include/v8.h"
+
+namespace cobalt {
+namespace script {
+namespace v8c {
+
+// Implements v8's platform class to handle some requests from v8 to cobalt.
+// It contains a v8::DefaultPlatform and uses most of its implementations.
+class CobaltPlatform : public base::RefCounted<CobaltPlatform>,
+                       public v8::Platform {
+ public:
+  explicit CobaltPlatform(std::unique_ptr<v8::Platform> platform)
+      : default_platform_(std::move(platform)) {
+    DCHECK(default_platform_.get());
+  }
+
+  // Because foreground tasks have to be run on the isolate's main thread,
+  // each JavaScriptEngine needs to register its isolate in IsolateFellowship
+  // so that when v8 post tasks to an isolate, we know which thread to call
+  // PumpMessageLoop and run the posted task on.
+  void RegisterIsolateOnThread(v8::Isolate* isolate, MessageLoop* message_loop);
+  void UnregisterIsolateOnThread(v8::Isolate* isolate);
+  void RunV8Task(v8::Isolate* isolate, scoped_ptr<v8::Task> task);
+
+  // v8::Platform APIs.
+  v8::PageAllocator* GetPageAllocator() override {
+    return default_platform_->GetPageAllocator();
+  }
+
+  void OnCriticalMemoryPressure() override {
+    default_platform_->OnCriticalMemoryPressure();
+  }
+
+  bool OnCriticalMemoryPressure(size_t length) override {
+    return default_platform_->OnCriticalMemoryPressure(length);
+  }
+
+  std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
+      v8::Isolate* isolate) override {
+    return default_platform_->GetForegroundTaskRunner(isolate);
+  }
+
+  std::shared_ptr<v8::TaskRunner> GetBackgroundTaskRunner(
+      v8::Isolate* isolate) override {
+    return default_platform_->GetBackgroundTaskRunner(isolate);
+  }
+
+  void CallOnBackgroundThread(v8::Task* task,
+                              ExpectedRuntime expected_runtime) override {
+    // DefaultPlatform initializes threads running in the background to do
+    // requested background work.
+    default_platform_->CallOnBackgroundThread(task, expected_runtime);
+  }
+
+  // Post task on the message loop of the isolate's corresponding
+  // JavaScriptEngine's main thread.
+  void CallOnForegroundThread(v8::Isolate* isolate, v8::Task* task) override;
+
+  void CallDelayedOnForegroundThread(v8::Isolate* isolate, v8::Task* task,
+                                     double delay_in_seconds) override;
+
+  void CallIdleOnForegroundThread(v8::Isolate* isolate,
+                                  v8::IdleTask* task) override {
+    SB_NOTIMPLEMENTED();
+  }
+
+  bool IdleTasksEnabled(v8::Isolate* isolate) override { return false; }
+
+  double MonotonicallyIncreasingTime() override {
+    return default_platform_->MonotonicallyIncreasingTime();
+  }
+
+  double CurrentClockTimeMillis() override {
+    return default_platform_->CurrentClockTimeMillis();
+  }
+
+  v8::TracingController* GetTracingController() override {
+    return default_platform_->GetTracingController();
+  }
+
+  v8::Platform* platform() const { return default_platform_.get(); }
+
+ private:
+  std::unique_ptr<v8::Platform> default_platform_;
+
+  struct TaskBeforeRegistration {
+    TaskBeforeRegistration(double delay_in_seconds, v8::Task* task)
+        : target_time(base::TimeTicks::Now() +
+                      base::TimeDelta::FromSecondsD(delay_in_seconds)),
+          task(task) {}
+    base::TimeTicks target_time;
+    std::unique_ptr<v8::Task> task;
+  };
+  struct MessageLoopMapEntry {
+    // If tasks are posted before isolate is registered, we record their delay
+    // and post them when isolate is registered.
+    std::vector<std::unique_ptr<TaskBeforeRegistration>>
+        tasks_before_registration;
+    MessageLoop* message_loop = NULL;
+  };
+  typedef std::map<v8::Isolate*, std::unique_ptr<MessageLoopMapEntry>>
+      MessageLoopMap;
+
+  MessageLoopMapEntry* FindOrAddMapEntry(v8::Isolate* isolate);
+
+  // A lookup table of isolate to its main thread's task runner.
+  MessageLoopMap message_loop_map_;
+  base::Lock lock_;
+
+  DISALLOW_COPY_AND_ASSIGN(CobaltPlatform);
+};
+
+}  // namespace v8c
+}  // namespace script
+}  // namespace cobalt
+
+#endif  // COBALT_SCRIPT_V8C_COBALT_PLATFORM_H_
diff --git a/src/cobalt/script/v8c/isolate_fellowship.cc b/src/cobalt/script/v8c/isolate_fellowship.cc
index 41c59ca..f3981ff 100644
--- a/src/cobalt/script/v8c/isolate_fellowship.cc
+++ b/src/cobalt/script/v8c/isolate_fellowship.cc
@@ -21,7 +21,6 @@
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "starboard/file.h"
-#include "v8/include/libplatform/libplatform.h"
 
 namespace cobalt {
 namespace script {
@@ -34,7 +33,8 @@
 IsolateFellowship::IsolateFellowship() {
   TRACE_EVENT0("cobalt::script", "IsolateFellowship::IsolateFellowship");
   // TODO: Initialize V8 ICU stuff here as well.
-  platform = v8::platform::CreateDefaultPlatform();
+  platform = new CobaltPlatform(
+      std::unique_ptr<v8::Platform>(v8::platform::CreateDefaultPlatform()));
   v8::V8::InitializePlatform(platform);
   v8::V8::Initialize();
   array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
@@ -47,10 +47,6 @@
   v8::V8::Dispose();
   v8::V8::ShutdownPlatform();
 
-  DCHECK(platform);
-  delete platform;
-  platform = nullptr;
-
   DCHECK(array_buffer_allocator);
   delete array_buffer_allocator;
   array_buffer_allocator = nullptr;
diff --git a/src/cobalt/script/v8c/isolate_fellowship.h b/src/cobalt/script/v8c/isolate_fellowship.h
index 677b060..6b6a631 100644
--- a/src/cobalt/script/v8c/isolate_fellowship.h
+++ b/src/cobalt/script/v8c/isolate_fellowship.h
@@ -16,6 +16,8 @@
 #define COBALT_SCRIPT_V8C_ISOLATE_FELLOWSHIP_H_
 
 #include "base/memory/singleton.h"
+#include "cobalt/script/v8c/cobalt_platform.h"
+#include "v8/include/libplatform/libplatform.h"
 #include "v8/include/v8-platform.h"
 #include "v8/include/v8.h"
 
@@ -34,7 +36,7 @@
                      StaticMemorySingletonTraits<IsolateFellowship>>::get();
   }
 
-  v8::Platform* platform = nullptr;
+  scoped_refptr<CobaltPlatform> platform = nullptr;
   v8::ArrayBuffer::Allocator* array_buffer_allocator = nullptr;
   v8::StartupData startup_data = {nullptr, 0};
 
diff --git a/src/cobalt/script/v8c/v8c.gyp b/src/cobalt/script/v8c/v8c.gyp
index fe0b091..7fd4c7a 100644
--- a/src/cobalt/script/v8c/v8c.gyp
+++ b/src/cobalt/script/v8c/v8c.gyp
@@ -21,6 +21,8 @@
         'algorithm_helpers.cc',
         'algorithm_helpers.h',
         'callback_function_conversion.h',
+        'cobalt_platform.cc',
+        'cobalt_platform.h',
         'conversion_helpers.cc',
         'conversion_helpers.h',
         'entry_scope.h',
@@ -161,29 +163,30 @@
       # its update indicates V8 code change.
       'target_name': 'update_snapshot_time',
       'type': 'none',
+      'hard_dependency': 1,
       'dependencies': [
         '<(DEPTH)/v8/src/v8.gyp:v8_base',
         '<(DEPTH)/v8/src/v8.gyp:v8_initializers',
         '<(DEPTH)/v8/src/v8.gyp:v8_libplatform',
       ],
       'variables': {
-        'script_path': '<(DEPTH)/starboard/build/touch.py',
-        'output_path': '<(DEPTH)/cobalt/script/v8c/isolate_fellowship.cc',
+        'touch_script_path': '<(DEPTH)/starboard/build/touch.py',
+        'touch_file_path': '<(DEPTH)/cobalt/script/v8c/isolate_fellowship.cc',
+        'dummy_output_path': '<(SHARED_INTERMEDIATE_DIR)/cobalt/script/v8c/isolate_fellowship_is_touched.stamp',
       },
       'actions': [
         {
           'action_name': 'update_snapshot_time',
           'inputs': [
-            '<(script_path)',
+            '<(touch_script_path)',
             '<(PRODUCT_DIR)/obj/v8/src/<(STATIC_LIB_PREFIX)v8_base<(STATIC_LIB_SUFFIX)',
             '<(PRODUCT_DIR)/obj/v8/src/<(STATIC_LIB_PREFIX)v8_initializers<(STATIC_LIB_SUFFIX)',
             '<(PRODUCT_DIR)/obj/v8/src/<(STATIC_LIB_PREFIX)v8_libplatform<(STATIC_LIB_SUFFIX)',
           ],
           'outputs': [
-            '<(output_path)',
+            '<(dummy_output_path)',
           ],
-          'action': ['python', '<(script_path)',
-                     '<(output_path)',
+          'action': ['python', '<(touch_script_path)', '<(touch_file_path)', '<(dummy_output_path)',
           ],
           'message': 'Updating V8 snapshot creation time.',
         },
diff --git a/src/cobalt/script/v8c/v8c_engine.cc b/src/cobalt/script/v8c/v8c_engine.cc
index 2a4234b..5885c69 100644
--- a/src/cobalt/script/v8c/v8c_engine.cc
+++ b/src/cobalt/script/v8c/v8c_engine.cc
@@ -19,7 +19,6 @@
 
 #include "base/debug/trace_event.h"
 #include "base/logging.h"
-#include "base/message_loop.h"
 #include "cobalt/base/c_val.h"
 #include "cobalt/browser/stack_size_constants.h"
 #include "cobalt/script/v8c/isolate_fellowship.h"
@@ -131,6 +130,8 @@
   SbOnce(&v8_flag_init_once_control, V8FlagInitOnce);
   isolate_ = v8::Isolate::New(create_params);
   CHECK(isolate_);
+  isolate_fellowship->platform->RegisterIsolateOnThread(isolate_,
+                                                        MessageLoop::current());
 
   // There are 2 total isolate data slots, one for the sole |V8cEngine| (us),
   // and one for the |V8cGlobalEnvironment|.
@@ -158,6 +159,8 @@
   TRACE_EVENT0("cobalt::script", "V8cEngine::~V8cEngine");
   DCHECK(thread_checker_.CalledOnValidThread());
 
+  IsolateFellowship::GetInstance()->platform->UnregisterIsolateOnThread(
+      isolate_);
   // Send a low memory notification to V8 in order to force a garbage
   // collection before shut down.  This is required to run weak callbacks that
   // are responsible for freeing native objects that live in the internal
diff --git a/src/cobalt/site/docs/development/setup-linux.md b/src/cobalt/site/docs/development/setup-linux.md
index 0a73913..7320c00 100644
--- a/src/cobalt/site/docs/development/setup-linux.md
+++ b/src/cobalt/site/docs/development/setup-linux.md
@@ -30,7 +30,7 @@
     Cobalt on Linux:
 
     ```
-    $ sudo apt-get install build-essential coreutils git gperf \
+    $ sudo apt-get install bison build-essential coreutils git gperf \
            libasound2-dev libavformat-dev libavresample-dev \
            libdirectfb-dev libdirectfb-extra libpulse-dev \
            libgl1-mesa-dev libgles2-mesa-dev libx11-dev \
@@ -45,23 +45,6 @@
     sudo apt-get install libstdc++-4.8-dev
     ```
 
-1.  Install `bison-2.7`. Note that this series of commands uninstalls any
-    version of `bison` that you already have installed to ensure that the
-    desired version is installed.
-
-    ```
-    $ sudo apt-get remove bison
-    $ cd /tmp
-    $ wget http://ftp.gnu.org/gnu/bison/bison-2.7.1.tar.gz
-    $ tar zxf bison-2.7.1.tar.gz
-    $ cd bison-2.7.1
-    $ sh configure && make && sudo make install
-    $ which bison
-    /usr/local/bin/bison
-    $ bison --version
-    bison (GNU Bison) 2.7.12-4996
-    ```
-
 1.  Clone the Cobalt code repository. The following `git` command creates a
     `cobalt` directory that contains the repository:
 
diff --git a/src/cobalt/webdriver/execute_test.cc b/src/cobalt/webdriver/execute_test.cc
index f188c73..50da6a7 100644
--- a/src/cobalt/webdriver/execute_test.cc
+++ b/src/cobalt/webdriver/execute_test.cc
@@ -127,7 +127,7 @@
       script_executor_->Execute(gc_prevented_params.params, &result_handler));
 }
 
-TEST_F(ScriptExecutorTest, ExecuteAsync) {
+TEST_F(ScriptExecutorTest, FLAKY_ExecuteAsync) {
   // Create a script that will call the async callback after 50 ms, with
   // an async timeout of 100 ms.
   auto gc_prevented_params = ScriptExecutorParams::Create(
diff --git a/src/starboard/contrib/creator/ci20x11/gyp_configuration.py b/src/starboard/contrib/creator/ci20x11/gyp_configuration.py
index b5feb4e..75d9285 100644
--- a/src/starboard/contrib/creator/ci20x11/gyp_configuration.py
+++ b/src/starboard/contrib/creator/ci20x11/gyp_configuration.py
@@ -43,6 +43,7 @@
         ar.StaticThinLinker(),
         ar.StaticLinker(),
         clangxx.ExecutableLinker(path=cxx_path),
+        clangxx.SharedLibraryLinker(path=cxx_path),
         cp.Copy(),
         touch.Stamp(),
         bash.Shell(),
diff --git a/src/starboard/contrib/creator/ci20x11/starboard_platform.gypi b/src/starboard/contrib/creator/ci20x11/starboard_platform.gypi
index d5eabcb..b7446e0 100644
--- a/src/starboard/contrib/creator/ci20x11/starboard_platform.gypi
+++ b/src/starboard/contrib/creator/ci20x11/starboard_platform.gypi
@@ -24,11 +24,18 @@
       '<(DEPTH)/starboard/shared/starboard/link_receiver.cc',
       '<(DEPTH)/starboard/shared/x11/application_x11.cc',
       '<(DEPTH)/starboard/shared/x11/egl_swap_buffers.cc',
+      '<(DEPTH)/starboard/shared/x11/player_set_bounds.cc',
       '<(DEPTH)/starboard/shared/x11/window_create.cc',
       '<(DEPTH)/starboard/shared/x11/window_destroy.cc',
       '<(DEPTH)/starboard/shared/x11/window_get_platform_handle.cc',
       '<(DEPTH)/starboard/shared/x11/window_get_size.cc',
       '<(DEPTH)/starboard/shared/x11/window_internal.cc',
     ],
+
+    # Exclude shared implementations specified by the included .gypi if this
+    # file already specifies a platform-specific version.
+    'starboard_platform_sources!': [
+      '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
+    ],
   },
 }
diff --git a/src/starboard/contrib/creator/ci20x11/system_get_property.cc b/src/starboard/contrib/creator/ci20x11/system_get_property.cc
index 23c9e9a..b8461de 100644
--- a/src/starboard/contrib/creator/ci20x11/system_get_property.cc
+++ b/src/starboard/contrib/creator/ci20x11/system_get_property.cc
@@ -36,6 +36,8 @@
   return true;
 }
 
+#if SB_API_VERSION < 10
+
 bool GetPlatformUuid(char* out_value, int value_length) {
   struct ifreq interface;
   struct ifconf config;
@@ -78,6 +80,8 @@
   return false;
 }
 
+#endif  // SB_API_VERSION < 10
+
 }  // namespace
 
 bool SbSystemGetProperty(SbSystemPropertyId property_id,
@@ -103,8 +107,10 @@
     case kSbSystemPropertyPlatformName:
       return CopyStringAndTestIfSuccess(out_value, value_length, kPlatformName);
 
+#if SB_API_VERSION < 10
     case kSbSystemPropertyPlatformUuid:
       return GetPlatformUuid(out_value, value_length);
+#endif  // SB_API_VERSION < 10
 
     default:
       SB_DLOG(WARNING) << __FUNCTION__
diff --git a/src/starboard/contrib/creator/shared/configuration_public.h b/src/starboard/contrib/creator/shared/configuration_public.h
index 4dcec1d..c8cbfae 100644
--- a/src/starboard/contrib/creator/shared/configuration_public.h
+++ b/src/starboard/contrib/creator/shared/configuration_public.h
@@ -88,7 +88,7 @@
 #define SB_HAS_CROSS_CORE_SCHEDULER 1
 
 // The API version implemented by this platform.
-#define SB_API_VERSION 6
+#define SB_API_VERSION SB_EXPERIMENTAL_API_VERSION
 
 // --- System Header Configuration -------------------------------------------
 
@@ -276,6 +276,14 @@
 // Whether the current platform has speech synthesis.
 #define SB_HAS_SPEECH_SYNTHESIS 0
 
+#if SB_API_VERSION >= 8
+// Whether the current platform implements the on screen keyboard interface.
+#define SB_HAS_ON_SCREEN_KEYBOARD 0
+
+// Whether the current platform uses a media player that relies on a URL.
+#define SB_HAS_PLAYER_WITH_URL 0
+#endif  // SB_API_VERSION >= 8
+
 // --- Media Configuration ---------------------------------------------------
 
 // Specifies whether this platform has support for a possibly-decrypting
@@ -326,6 +334,13 @@
 // stack size for media stack threads.
 #define SB_MEDIA_THREAD_STACK_SIZE 0U
 
+// Specifies whether this platform updates audio frames asynchronously.  In such
+// case an extra parameter will be added to |SbAudioSinkConsumeFramesFunc| to
+// indicate the absolute time that the consumed audio frames are reported.
+// Check document for |SbAudioSinkConsumeFramesFunc| in audio_sink.h for more
+// details.
+#define SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING 0
+
 // --- Decoder-only Params ---
 
 // Specifies how media buffers must be aligned on this platform as some
diff --git a/src/starboard/contrib/creator/shared/gyp_configuration.py b/src/starboard/contrib/creator/shared/gyp_configuration.py
index 0916e68..244d13d 100644
--- a/src/starboard/contrib/creator/shared/gyp_configuration.py
+++ b/src/starboard/contrib/creator/shared/gyp_configuration.py
@@ -72,8 +72,9 @@
 
   def GetEnvironmentVariables(self):
     self.ci20_home = self._GetCi20Home()
-    self.host_compiler_environment = build.GetHostCompilerEnvironment(
-        clang.GetClangSpecification(), False)
+    if not hasattr(self, 'host_compiler_environment'):
+      self.host_compiler_environment = build.GetHostCompilerEnvironment(
+          clang.GetClangSpecification(), False)
     env_variables = self.host_compiler_environment
     env_variables = {
         'CC': self.host_compiler_environment['CC_host'],
diff --git a/src/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_sfr_only.cc b/src/starboard/contrib/creator/shared/media_is_video_supported.cc
similarity index 100%
rename from src/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_sfr_only.cc
rename to src/starboard/contrib/creator/shared/media_is_video_supported.cc
diff --git a/src/starboard/contrib/creator/shared/starboard_platform.gypi b/src/starboard/contrib/creator/shared/starboard_platform.gypi
index dc68740..0353a9e 100644
--- a/src/starboard/contrib/creator/shared/starboard_platform.gypi
+++ b/src/starboard/contrib/creator/shared/starboard_platform.gypi
@@ -14,6 +14,7 @@
 {
   'variables': {
     'starboard_platform_sources': [
+      '<(DEPTH)/starboard/contrib/creator/shared/media_is_video_supported.cc',
       '<(DEPTH)/starboard/contrib/creator/shared/player_components_impl.cc',
       '<(DEPTH)/starboard/linux/shared/atomic_public.h',
       '<(DEPTH)/starboard/linux/shared/decode_target_internal.h',
@@ -35,6 +36,7 @@
       '<(DEPTH)/starboard/shared/dlmalloc/memory_free.cc',
       '<(DEPTH)/starboard/shared/dlmalloc/memory_free_aligned.cc',
       '<(DEPTH)/starboard/shared/dlmalloc/memory_map.cc',
+      '<(DEPTH)/starboard/shared/dlmalloc/memory_protect.cc',
       '<(DEPTH)/starboard/shared/dlmalloc/memory_reallocate_unchecked.cc',
       '<(DEPTH)/starboard/shared/dlmalloc/memory_unmap.cc',
       '<(DEPTH)/starboard/shared/gcc/atomic_gcc_public.h',
@@ -214,11 +216,22 @@
       '<(DEPTH)/starboard/shared/starboard/media/codec_util.cc',
       '<(DEPTH)/starboard/shared/starboard/media/codec_util.h',
       '<(DEPTH)/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_buffer_budget.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_configuration_stereo_only.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_output_count_stereo_only.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_output_count_single_audio_output.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_alignment.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_padding.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_storage_type.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_initial_buffer_capacity.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_max_buffer_capacity.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_get_video_buffer_budget.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_is_audio_supported_aac_only.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_is_output_protected.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_sfr_only.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc',
+      '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_set_output_protection.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_util.cc',
       '<(DEPTH)/starboard/shared/starboard/media/media_util.h',
@@ -274,10 +287,13 @@
       '<(DEPTH)/starboard/shared/starboard/player/player_destroy.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_get_current_frame.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_get_info.cc',
+      '<(DEPTH)/starboard/shared/starboard/player/player_get_info2.cc',
+      '<(DEPTH)/starboard/shared/starboard/player/player_get_maximum_number_of_samples_per_write.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_output_mode_supported.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_internal.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_internal.h',
       '<(DEPTH)/starboard/shared/starboard/player/player_seek.cc',
+      '<(DEPTH)/starboard/shared/starboard/player/player_seek2.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_set_playback_rate.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_set_volume.cc',
@@ -285,6 +301,7 @@
       '<(DEPTH)/starboard/shared/starboard/player/player_worker.h',
       '<(DEPTH)/starboard/shared/starboard/player/player_write_end_of_stream.cc',
       '<(DEPTH)/starboard/shared/starboard/player/player_write_sample.cc',
+      '<(DEPTH)/starboard/shared/starboard/player/player_write_sample2.cc',
       '<(DEPTH)/starboard/shared/starboard/queue_application.cc',
       '<(DEPTH)/starboard/shared/starboard/string_concat.cc',
       '<(DEPTH)/starboard/shared/starboard/string_concat_wide.cc',
@@ -296,6 +313,7 @@
       '<(DEPTH)/starboard/shared/starboard/system_request_stop.cc',
       '<(DEPTH)/starboard/shared/starboard/system_request_suspend.cc',
       '<(DEPTH)/starboard/shared/starboard/system_request_unpause.cc',
+      '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc',
       '<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
       '<(DEPTH)/starboard/shared/stub/accessibility_get_display_settings.cc',
       '<(DEPTH)/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc',
@@ -313,6 +331,8 @@
       '<(DEPTH)/starboard/shared/stub/drm_generate_session_update_request.cc',
       '<(DEPTH)/starboard/shared/stub/drm_system_internal.h',
       '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
+      '<(DEPTH)/starboard/shared/stub/drm_is_server_certificate_updatable.cc',
+      '<(DEPTH)/starboard/shared/stub/drm_update_server_certificate.cc',
       '<(DEPTH)/starboard/shared/stub/image_decode.cc',
       '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
       '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
diff --git a/src/starboard/linux/shared/drm_create_system.cc b/src/starboard/linux/shared/drm_create_system.cc
new file mode 100644
index 0000000..b213cb0
--- /dev/null
+++ b/src/starboard/linux/shared/drm_create_system.cc
@@ -0,0 +1,70 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/drm.h"
+
+#include "starboard/log.h"
+#include "starboard/shared/widevine/drm_system_widevine.h"
+#include "starboard/string.h"
+
+SbDrmSystem SbDrmCreateSystem(
+    const char* key_system,
+    void* context,
+    SbDrmSessionUpdateRequestFunc update_request_callback,
+    SbDrmSessionUpdatedFunc session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+    ,
+    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+    ,
+    SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
+    SbDrmSessionClosedFunc session_closed_callback
+#endif  // SB_API_VERSION >= 10
+    ) {
+  using starboard::shared::widevine::DrmSystemWidevine;
+  if (!update_request_callback || !session_updated_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#if SB_HAS(DRM_KEY_STATUSES)
+  if (!key_statuses_changed_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+  if (!server_certificate_updated_callback || !session_closed_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#endif  // SB_API_VERSION >= 10
+  if (!DrmSystemWidevine::IsKeySystemSupported(key_system)) {
+    SB_DLOG(WARNING) << "Invalid key system " << key_system;
+    return kSbDrmSystemInvalid;
+  }
+  return new DrmSystemWidevine(context, update_request_callback,
+                               session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+                               ,
+                               key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+                               ,
+                               server_certificate_updated_callback
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+                               ,
+                               session_closed_callback
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+                               ,
+                               "Linux", "Linux");
+}
diff --git a/src/starboard/linux/shared/gyp_configuration.gypi b/src/starboard/linux/shared/gyp_configuration.gypi
index 3f258bb..5fccc41 100644
--- a/src/starboard/linux/shared/gyp_configuration.gypi
+++ b/src/starboard/linux/shared/gyp_configuration.gypi
@@ -19,6 +19,7 @@
   'variables': {
     'target_arch%': 'x64',
     'target_os': 'linux',
+    'sb_widevine_platform' : 'linux',
 
     'platform_libraries': [
       '-lasound',
diff --git a/src/starboard/linux/shared/media_is_video_supported.cc b/src/starboard/linux/shared/media_is_video_supported.cc
index 906ef5b..cf31d04 100644
--- a/src/starboard/linux/shared/media_is_video_supported.cc
+++ b/src/starboard/linux/shared/media_is_video_supported.cc
@@ -21,7 +21,24 @@
                                        int frame_width,
                                        int frame_height,
                                        int64_t bitrate,
-                                       int fps) {
+                                       int fps
+#if SB_API_VERSION >= 10
+                                       ,
+                                       bool decode_to_texture_required
+#endif  // SB_API_VERSION >= 10
+                                       ) {
+#if SB_API_VERSION >= 10
+#if SB_HAS(BLITTER)
+  if (decode_to_texture_required) {
+    return false;
+  }
+#else
+  // Assume that all non-Blitter Linux platforms can play decode-to-texture
+  // video just as well as normal video.
+  SB_UNREFERENCED_PARAMETER(decode_to_texture_required);
+#endif  // SB_HAS(BLITTER)
+#endif  // SB_API_VERSION >= 10
+
   return (video_codec == kSbMediaVideoCodecH264 ||
           video_codec == kSbMediaVideoCodecVp9) &&
          frame_width <= 1920 && frame_height <= 1080 &&
diff --git a/src/starboard/linux/shared/oemcrypto_engine_device_properties_linux.cc b/src/starboard/linux/shared/oemcrypto_engine_device_properties_linux.cc
index e9d735b..a4b623f 100644
--- a/src/starboard/linux/shared/oemcrypto_engine_device_properties_linux.cc
+++ b/src/starboard/linux/shared/oemcrypto_engine_device_properties_linux.cc
@@ -22,9 +22,9 @@
 
 namespace wvoec_mock {
 
-class CryptoEngineXb1 : public CryptoEngine {
+class CryptoEngineLinux : public CryptoEngine {
  public:
-  explicit CryptoEngineXb1(std::auto_ptr<wvcdm::FileSystem> file_system)
+  explicit CryptoEngineLinux(std::auto_ptr<wvcdm::FileSystem> file_system)
       : CryptoEngine(file_system) {}
 
   OEMCrypto_HDCP_Capability config_current_hdcp_capability() override {
@@ -34,11 +34,14 @@
   OEMCrypto_HDCP_Capability config_maximum_hdcp_capability() override {
     return kWidevineMaximumHdcpVersion;
   }
+
+  // Max buffer size for encoded buffer.
+  size_t max_buffer_size() override { return 3840 * 2160 * 2; }
 };
 
 CryptoEngine* CryptoEngine::MakeCryptoEngine(
     std::auto_ptr<wvcdm::FileSystem> file_system) {
-  return new CryptoEngineXb1(file_system);
+  return new CryptoEngineLinux(file_system);
 }
 
 }  // namespace wvoec_mock
diff --git a/src/starboard/linux/shared/starboard_platform.gypi b/src/starboard/linux/shared/starboard_platform.gypi
index 71df991..c7588ca 100644
--- a/src/starboard/linux/shared/starboard_platform.gypi
+++ b/src/starboard/linux/shared/starboard_platform.gypi
@@ -341,10 +341,11 @@
       }],
       ['has_cdm==1', {
         'starboard_platform_dependencies': [
-          '<(DEPTH)/starboard/linux/shared/widevine3.gyp:oemcrypto',
-          '<(DEPTH)/starboard/linux/shared/widevine3.gyp:widevine_ce_cdm_static',
+          '<(DEPTH)/starboard/shared/widevine/widevine3.gyp:oemcrypto',
+          '<(DEPTH)/starboard/shared/widevine/widevine3.gyp:widevine_ce_cdm_static',
         ],
         'starboard_platform_sources': [
+          '<(DEPTH)/starboard/linux/shared/drm_create_system.cc',
           '<(DEPTH)/starboard/linux/shared/media_is_output_protected.cc',
           '<(DEPTH)/starboard/linux/shared/oemcrypto_engine_device_properties_linux.cc',
 
@@ -354,10 +355,9 @@
           '<(DEPTH)/starboard/shared/starboard/drm/drm_system_internal.h',
           '<(DEPTH)/starboard/shared/starboard/drm/drm_update_session.cc',
 
-          '<(DEPTH)/starboard/shared/widevine/drm_create_system.cc',
           '<(DEPTH)/starboard/shared/widevine/drm_is_server_certificate_updatable.cc',
-          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine3.cc',
-          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine3.h',
+          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine.cc',
+          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine.h',
           '<(DEPTH)/starboard/shared/widevine/drm_update_server_certificate.cc',
           '<(DEPTH)/starboard/shared/widevine/media_is_supported.cc',
           '<(DEPTH)/starboard/shared/widevine/widevine_storage.cc',
diff --git a/src/starboard/linux/shared/widevine3.gyp b/src/starboard/linux/shared/widevine3.gyp
deleted file mode 100644
index c081b11..0000000
--- a/src/starboard/linux/shared/widevine3.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/shared/widevine/widevine3.gypi',
-  ],
-  'variables': {
-    'platform_oem_sources': [
-      '<(DEPTH)/starboard/keyboxes/linux/linux.h',
-      '<(DEPTH)/starboard/keyboxes/linux/linux_client.c',
-      '<(DEPTH)/starboard/linux/shared/wv_keybox_linux.cc',
-    ],
-  },
-  'target_defaults': {
-    'defines': [
-      'COBALT_WIDEVINE_KEYBOX_INCLUDE="<(DEPTH)/starboard/keyboxes/widevine_settings_linux.h"',
-    ],
-  },
-}
diff --git a/src/starboard/linux/shared/wv_keybox_linux.cc b/src/starboard/linux/shared/wv_keybox_linux.cc
deleted file mode 100644
index 026b392..0000000
--- a/src/starboard/linux/shared/wv_keybox_linux.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "third_party/ce_cdm/oemcrypto/mock/src/oemcrypto_keybox_mock.h"
-
-#include <openssl/bn.h>
-#include <vector>
-
-extern "C" {
-#include "starboard/keyboxes/linux/linux.h"
-};
-
-#include "third_party/ce_cdm/oemcrypto/mock/src/wv_keybox.h"
-
-namespace wvoec_mock {
-
-namespace {
-#if defined(COBALT_WIDEVINE_KEYBOX_INCLUDE)
-#include COBALT_WIDEVINE_KEYBOX_INCLUDE
-#else  // COBALT_WIDEVINE_KEYBOX_INCLUDE
-#error "COBALT_WIDEVINE_KEYBOX_INCLUDE is not defined."
-#endif  // COBALT_WIDEVINE_KEYBOX_INCLUDE
-}  // namespace
-
-// |kKeybox| provided in obfiscated form: the key field need to be
-// de-obfiscated before installing to CryptoEngine, rest fields
-// left as-is and should not be de-obfuscated.
-bool WvKeybox::Prepare() {
-  // Create a temporary kKeybox's copy with ofuscated key.
-  WidevineKeybox keybox(kKeybox);
-
-  // Replace obfuscated with de-obfiscated and install.
-  uint8_t clear_key[sizeof(kObfuscatedKey)];
-  linux_client(clear_key, const_cast<unsigned char*>(kObfuscatedKey));
-  SbMemoryCopy(&keybox.device_key_, clear_key, sizeof(keybox.device_key_));
-
-  // Erase |de_obfuscated| because it contains clear key
-  SbMemorySet(&clear_key, 0, sizeof(clear_key));
-  if (!InstallKeybox(reinterpret_cast<const uint8_t*>(&keybox),
-                     sizeof(WidevineKeybox))) {
-    return false;
-  }
-
-  // Erase temporary kKeybox's copy because it is de-obfuscated
-  SbMemorySet(&keybox, 0, sizeof(WidevineKeybox));
-  return true;
-}
-
-}  // namespace wvoec_mock
diff --git a/src/starboard/linux/x64x11/widevine.gyp b/src/starboard/linux/x64x11/widevine.gyp
deleted file mode 100644
index 1dedb90..0000000
--- a/src/starboard/linux/x64x11/widevine.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-     'platform_oem_sources': [
-       '<(DEPTH)/starboard/keyboxes/linux/linux.h',
-       '<(DEPTH)/starboard/keyboxes/linux/linux_client.c',
-       'wv_keybox.cc',
-     ],
-  },
-  'includes': [
-    '<(DEPTH)/starboard/shared/widevine/widevine.gypi',
-  ],
-  'target_defaults': {
-    'defines': [
-      'COBALT_WIDEVINE_KEYBOX_INCLUDE="starboard/keyboxes/widevine_settings_linux.h"',
-    ],
-  },
-}
diff --git a/src/starboard/linux/x64x11/wv_keybox.cc b/src/starboard/linux/x64x11/wv_keybox.cc
deleted file mode 100644
index dacf66c..0000000
--- a/src/starboard/linux/x64x11/wv_keybox.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-
-#include <cstring>
-
-#include "starboard/keyboxes/linux/linux.h"
-#include "third_party/cdm/oemcrypto/mock/src/oemcrypto_keybox_mock.h"
-#include "third_party/cdm/oemcrypto/mock/src/wv_keybox.h"
-
-namespace wvoec_mock {
-
-namespace {
-
-#if defined(COBALT_WIDEVINE_KEYBOX_INCLUDE)
-#include COBALT_WIDEVINE_KEYBOX_INCLUDE
-#else  // COBALT_WIDEVINE_KEYBOX_INCLUDE
-#error "COBALT_WIDEVINE_KEYBOX_INCLUDE is not defined."
-#endif  // COBALT_WIDEVINE_KEYBOX_INCLUDE
-
-}  // namespace
-
-bool WvKeybox::Prepare() {
-  // Make a local copy of the keybox.
-  WidevineKeybox keybox;
-  memcpy(&keybox, &kKeybox, sizeof(WidevineKeybox));
-
-  // Unobfuscate the key.
-  uint8_t clear[sizeof(kObfuscatedKey)];
-  // Despite the non-const type, linux_client does not modify the second
-  // argument.
-  linux_client(clear, const_cast<uint8_t*>(kObfuscatedKey));
-
-  // Move the clear key into the local copy of the keybox.
-  // NOTE: Clear device keys are half the size of obfuscated ones.
-  memcpy(&keybox.device_key_, clear, sizeof(keybox.device_key_));
-  memset(clear, 0, sizeof(clear));
-
-  // Install the local copy of the keybox.
-  uint8_t* bytes = reinterpret_cast<uint8_t*>(&keybox);
-  InstallKeybox(bytes, sizeof(keybox));
-
-  // Wipe the local copy of the keybox.
-  memset(&keybox, 0, sizeof(keybox));
-
-  return true;
-}
-
-}  // namespace wvoec_mock
diff --git a/src/starboard/nplb/audio_sink_helpers.cc b/src/starboard/nplb/audio_sink_helpers.cc
index 5b5209e..e811e06 100644
--- a/src/starboard/nplb/audio_sink_helpers.cc
+++ b/src/starboard/nplb/audio_sink_helpers.cc
@@ -86,12 +86,7 @@
 
 AudioSinkTestEnvironment::AudioSinkTestEnvironment(
     const AudioSinkTestFrameBuffers& frame_buffers)
-    : frame_buffers_(frame_buffers),
-      condition_variable_(mutex_),
-      update_source_status_call_count_(0),
-      frames_appended_(0),
-      frames_consumed_(0),
-      is_playing_(true) {
+    : frame_buffers_(frame_buffers), condition_variable_(mutex_) {
   sink_ = SbAudioSinkCreate(
       frame_buffers_.channels(), sample_rate(), frame_buffers_.sample_type(),
       frame_buffers_.storage_type(), frame_buffers_.frame_buffers(),
@@ -151,6 +146,7 @@
 
 bool AudioSinkTestEnvironment::WaitUntilAllFramesAreConsumed() {
   ScopedLock lock(mutex_);
+  is_eos_reached_ = true;
   SbTimeMonotonic start = SbTimeGetMonotonicNow();
   while (frames_appended_ != frames_consumed_) {
     SbTime time_elapsed = SbTimeGetMonotonicNow() - start;
@@ -169,9 +165,9 @@
                                                     bool* is_eos_reached) {
   ScopedLock lock(mutex_);
   *frames_in_buffer = frames_appended_ - frames_consumed_;
-  *offset_in_frames = frames_appended_ % frame_buffers_.frames_per_channel();
+  *offset_in_frames = frames_consumed_ % frame_buffers_.frames_per_channel();
   *is_playing = is_playing_;
-  *is_eos_reached = false;
+  *is_eos_reached = is_eos_reached_;
   ++update_source_status_call_count_;
   condition_variable_.Signal();
 }
diff --git a/src/starboard/nplb/audio_sink_helpers.h b/src/starboard/nplb/audio_sink_helpers.h
index 5382d05..861d381 100644
--- a/src/starboard/nplb/audio_sink_helpers.h
+++ b/src/starboard/nplb/audio_sink_helpers.h
@@ -73,6 +73,8 @@
       const AudioSinkTestFrameBuffers& frame_buffers);
   ~AudioSinkTestEnvironment();
 
+  bool is_valid() const { return SbAudioSinkIsValid(sink_); }
+
   static int sample_rate() {
     return SbAudioSinkGetNearestSupportedSampleFrequency(kSampleRateCD);
   }
@@ -114,10 +116,11 @@
   Mutex mutex_;
   ConditionVariable condition_variable_;
 
-  int update_source_status_call_count_;
-  int frames_appended_;
-  int frames_consumed_;
-  bool is_playing_;
+  int update_source_status_call_count_ = 0;
+  int frames_appended_ = 0;
+  int frames_consumed_ = 0;
+  bool is_playing_ = true;
+  bool is_eos_reached_ = false;
 };
 
 }  // namespace nplb
diff --git a/src/starboard/nplb/audio_sink_test.cc b/src/starboard/nplb/audio_sink_test.cc
index 58a7437..5f167ef 100644
--- a/src/starboard/nplb/audio_sink_test.cc
+++ b/src/starboard/nplb/audio_sink_test.cc
@@ -17,6 +17,8 @@
 #include <algorithm>
 
 #include "starboard/nplb/audio_sink_helpers.h"
+#include "starboard/thread.h"
+#include "starboard/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace starboard {
@@ -25,6 +27,7 @@
 TEST(SbAudioSinkTest, UpdateStatusCalled) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
 
   EXPECT_TRUE(environment.WaitUntilUpdateStatusCalled());
   EXPECT_TRUE(environment.WaitUntilUpdateStatusCalled());
@@ -33,14 +36,16 @@
 TEST(SbAudioSinkTest, SomeFramesConsumed) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
 
-  environment.AppendFrame(1);
+  environment.AppendFrame(512);
   EXPECT_TRUE(environment.WaitUntilSomeFramesAreConsumed());
 }
 
 TEST(SbAudioSinkTest, AllFramesConsumed) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
 
   environment.AppendFrame(1024);
   EXPECT_TRUE(environment.WaitUntilAllFramesAreConsumed());
@@ -49,6 +54,7 @@
 TEST(SbAudioSinkTest, MultipleAppendAndConsume) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
 
   int frames_to_append = frame_buffers.frames_per_channel();
 
@@ -61,6 +67,8 @@
 TEST(SbAudioSinkTest, Pause) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
+
   environment.SetIsPlaying(false);
 
   int frames_to_append = frame_buffers.frames_per_channel();
@@ -74,10 +82,24 @@
   EXPECT_TRUE(environment.WaitUntilSomeFramesAreConsumed());
 }
 
+TEST(SbAudioSinkTest, Underflow) {
+  AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
+  AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
+
+  environment.AppendFrame(1024);
+  EXPECT_TRUE(environment.WaitUntilSomeFramesAreConsumed());
+  SbThreadSleep(250 * kSbTimeMillisecond);
+  environment.AppendFrame(1024);
+  EXPECT_TRUE(environment.WaitUntilAllFramesAreConsumed());
+}
+
 TEST(SbAudioSinkTest, ContinuousAppend) {
   AudioSinkTestFrameBuffers frame_buffers(SbAudioSinkGetMaxChannels());
 
   AudioSinkTestEnvironment environment(frame_buffers);
+  ASSERT_TRUE(environment.is_valid());
+
   int sample_rate = environment.sample_rate();
   // We are trying to send 1/4s worth of audio samples.
   int frames_to_append = sample_rate / 4;
diff --git a/src/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_hfr_only.cc b/src/starboard/raspi/shared/media_is_video_supported.cc
similarity index 80%
rename from src/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_hfr_only.cc
rename to src/starboard/raspi/shared/media_is_video_supported.cc
index e7e1f0c..8ac8105 100644
--- a/src/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_hfr_only.cc
+++ b/src/starboard/raspi/shared/media_is_video_supported.cc
@@ -21,8 +21,13 @@
                                        int frame_width,
                                        int frame_height,
                                        int64_t bitrate,
-                                       int fps) {
+                                       int fps,
+                                       bool decode_to_texture_required) {
+  if (decode_to_texture_required) {
+    // There currently is no Raspberry Pi 360 video implementation.
+    return false;
+  }
   return video_codec == kSbMediaVideoCodecH264 && frame_width <= 1920 &&
          frame_height <= 1080 &&
-         bitrate <= SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND && fps <= 60;
+         bitrate <= SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND && fps <= 30;
 }
diff --git a/src/starboard/raspi/shared/starboard_platform.gypi b/src/starboard/raspi/shared/starboard_platform.gypi
index fcfc889..be746db 100644
--- a/src/starboard/raspi/shared/starboard_platform.gypi
+++ b/src/starboard/raspi/shared/starboard_platform.gypi
@@ -50,6 +50,7 @@
         '<(DEPTH)/starboard/raspi/shared/dispmanx_util.cc',
         '<(DEPTH)/starboard/raspi/shared/dispmanx_util.h',
         '<(DEPTH)/starboard/raspi/shared/main.cc',
+        '<(DEPTH)/starboard/raspi/shared/media_is_video_supported.cc',
         '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_create.cc',
         '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_create.h',
         '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_get_info.cc',
@@ -248,8 +249,6 @@
         '<(DEPTH)/starboard/shared/signal/suspend_signals.cc',
         '<(DEPTH)/starboard/shared/signal/suspend_signals.h',
         '<(DEPTH)/starboard/shared/starboard/application.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.h',
         '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
         '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
         '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.cc',
@@ -257,6 +256,8 @@
         '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc',
         '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc',
         '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h',
+        '<(DEPTH)/starboard/shared/starboard/command_line.cc',
+        '<(DEPTH)/starboard/shared/starboard/command_line.h',
         '<(DEPTH)/starboard/shared/starboard/directory_can_open.cc',
         '<(DEPTH)/starboard/shared/starboard/event_cancel.cc',
         '<(DEPTH)/starboard/shared/starboard/event_schedule.cc',
@@ -289,7 +290,6 @@
         '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc',
         '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
         '<(DEPTH)/starboard/shared/starboard/media/media_is_output_protected.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_video_supported_h264_1080p_sfr_only.cc',
         '<(DEPTH)/starboard/shared/starboard/media/media_set_output_protection.cc',
         '<(DEPTH)/starboard/shared/starboard/media/media_util.cc',
         '<(DEPTH)/starboard/shared/starboard/media/media_util.h',
@@ -308,9 +308,9 @@
         '<(DEPTH)/starboard/shared/starboard/player/player_get_info.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_get_info2.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_get_maximum_number_of_samples_per_write.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/player_output_mode_supported.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_internal.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_internal.h',
+        '<(DEPTH)/starboard/shared/starboard/player/player_output_mode_supported.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_seek.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_seek2.cc',
         '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
diff --git a/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_internal.cc b/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_internal.cc
index 3179924..56e4a29 100644
--- a/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_internal.cc
+++ b/src/starboard/shared/ffmpeg/ffmpeg_video_decoder_internal.cc
@@ -31,6 +31,9 @@
                                        SbDrmSystem drm_system) {
   SB_UNREFERENCED_PARAMETER(codec);
   SB_UNREFERENCED_PARAMETER(drm_system);
+#if SB_HAS(BLITTER)
+  return output_mode == kSbPlayerOutputModePunchOut;
+#endif
 
 #if defined(SB_FORCE_DECODE_TO_TEXTURE_ONLY)
   // Starboard lib targets may not draw directly to the window, so punch through
diff --git a/src/starboard/shared/posix/socket_listen.cc b/src/starboard/shared/posix/socket_listen.cc
index f5f623f..6153c85 100644
--- a/src/starboard/shared/posix/socket_listen.cc
+++ b/src/starboard/shared/posix/socket_listen.cc
@@ -16,6 +16,7 @@
 
 #include <errno.h>
 #include <sys/socket.h>
+#include <sys/types.h>
 
 #include "starboard/log.h"
 #include "starboard/shared/posix/socket_internal.h"
@@ -29,10 +30,23 @@
   }
 
   SB_DCHECK(socket->socket_fd >= 0);
-  // TODO: Determine if we need to specify a > 0 backlog. It can go up to
-  // SOMAXCONN according to the documentation. Several places in chromium
-  // specify the literal "10" with the comment "maybe dont allow any backlog?"
-  int result = listen(socket->socket_fd, 0);
+  // We set the backlog to SOMAXCONN to ensure that it is above 1, and high
+  // enough that all tests are able to pass.  Some tests will fail on this
+  // because they expect to be able to successfully initiate multiple connects
+  // at once, and then after all connects have been initiated to subsequently
+  // initiate corresponding accepts.
+#if defined(SOMAXCONN)
+  const int kMaxConn = SOMAXCONN;
+#else
+  // Some posix platforms such as FreeBSD do not define SOMAXCONN.
+  // In this case, set the value to an arbitrary number large enough to
+  // satisfy most use-cases and tests, empirically we have found that 128
+  // is sufficient.  All implementations of listen() specify that a backlog
+  // parameter larger than the system max will be silently truncated to the
+  // system's max.
+  const int kMaxConn = 128;
+#endif
+  int result = listen(socket->socket_fd, kMaxConn);
   if (result != 0) {
     return (socket->error = sbposix::TranslateSocketErrno(result));
   }
diff --git a/src/starboard/shared/starboard/drm/drm_system_internal.h b/src/starboard/shared/starboard/drm/drm_system_internal.h
index 6db745c..696855b 100644
--- a/src/starboard/shared/starboard/drm/drm_system_internal.h
+++ b/src/starboard/shared/starboard/drm/drm_system_internal.h
@@ -41,11 +41,11 @@
 
   virtual DecryptStatus Decrypt(InputBuffer* buffer) = 0;
 
-#if SB_API_VERSION >= SB_DRM_REFINEMENT_API_VERSION
+#if SB_API_VERSION >= 10
   virtual void UpdateServerCertificate(int ticket,
                                        const void* certificate,
                                        int certificate_size) = 0;
-#endif  // SB_API_VERSION >= SB_DRM_REFINEMENT_API_VERSION
+#endif  // SB_API_VERSION >= 10
 };
 
 #endif  // STARBOARD_SHARED_STARBOARD_DRM_DRM_SYSTEM_INTERNAL_H_
diff --git a/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc b/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc
index 5555f3f..a20ec3e 100644
--- a/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc
+++ b/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc
@@ -41,7 +41,12 @@
 //
 // Note that canPlayType() doesn't support extra parameters like width, height
 // and channels.
-SbMediaSupportType CanPlayProgressiveVideo(const MimeType& mime_type) {
+SbMediaSupportType CanPlayProgressiveVideo(const MimeType& mime_type,
+                                           bool decode_to_texture_required) {
+#if SB_API_VERSION < 10
+  SB_UNREFERENCED_PARAMETER(decode_to_texture_required);
+#endif  // SB_API_VERSION < 10
+
   const std::vector<std::string>& codecs = mime_type.GetCodecs();
 
   SB_DCHECK(codecs.size() == 2) << codecs.size();
@@ -74,7 +79,12 @@
       }
     }
     if (!SbMediaIsVideoSupported(video_codec, width, height, kDefaultBitRate,
-                                 fps)) {
+                                 fps
+#if SB_API_VERSION >= 10
+                                 ,
+                                 decode_to_texture_required
+#endif  // SB_API_VERSION >= 10
+                                 )) {
       return kSbMediaSupportTypeNotSupported;
     }
   }
@@ -104,6 +114,9 @@
 //   isTypeSupported(audio/webm; codecs="opus")
 //   isTypeSupported(audio/mp4; codecs="mp4a.40.2"; channels=2)
 //   isTypeSupported(audio/mp4; codecs="mp4a.40.2"; channels=99)
+//   isTypeSupported(video/mp4; codecs="avc1.4d401e"; decode-to-texture=true)
+//   isTypeSupported(video/mp4; codecs="avc1.4d401e"; decode-to-texture=false)
+//   isTypeSupported(video/mp4; codecs="avc1.4d401e"; decode-to-texture=invalid)
 SbMediaSupportType CanPlayMimeAndKeySystem(const MimeType& mime_type,
                                            const char* key_system) {
   SB_DCHECK(mime_type.is_valid());
@@ -118,6 +131,19 @@
     }
   }
 
+  bool decode_to_texture_required = false;
+#if SB_API_VERSION >= 10
+  std::string decode_to_texture_value =
+      mime_type.GetParamStringValue("decode-to-texture", "false");
+  if (decode_to_texture_value == "true") {
+    decode_to_texture_required = true;
+  } else if (decode_to_texture_value != "false") {
+    // If an invalid value (e.g. not "true" or "false") is passed in for
+    // decode-to-texture, trivially reject.
+    return kSbMediaSupportTypeNotSupported;
+  }
+#endif  // SB_API_VERSION >= 10
+
   if (codecs.size() == 0) {
     // When there is no codecs listed, returns |kSbMediaSupportTypeMaybe| and
     // reject unsupported formats when query again with valid "codecs".
@@ -130,7 +156,7 @@
 
   if (codecs.size() == 2) {
     SB_DCHECK(SbStringGetLength(key_system) == 0);
-    return CanPlayProgressiveVideo(mime_type);
+    return CanPlayProgressiveVideo(mime_type, decode_to_texture_required);
   }
 
   SB_DCHECK(codecs.size() == 1);
@@ -208,7 +234,12 @@
 
     int bitrate = mime_type.GetParamIntValue("bitrate", kDefaultBitRate);
 
-    if (SbMediaIsVideoSupported(video_codec, width, height, bitrate, fps)) {
+    if (SbMediaIsVideoSupported(video_codec, width, height, bitrate, fps
+#if SB_API_VERSION >= 10
+                                ,
+                                decode_to_texture_required
+#endif  // SB_API_VERSION >= 10
+                                )) {
       return kSbMediaSupportTypeProbably;
     }
 
diff --git a/src/starboard/shared/starboard/media/media_support_internal.h b/src/starboard/shared/starboard/media/media_support_internal.h
index 3da76bb..0ecefdf 100644
--- a/src/starboard/shared/starboard/media/media_support_internal.h
+++ b/src/starboard/shared/starboard/media/media_support_internal.h
@@ -35,11 +35,18 @@
 // |frame_height|: The frame height of the media content.
 // |bitrate|: The bitrate of the media content.
 // |fps|: The number of frames per second in the media content.
+// |decode_to_texture_required|: Whether or not the resulting video frames can
+//                               be decoded and used as textures by the GPU.
 SB_EXPORT bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
                                        int frame_width,
                                        int frame_height,
                                        int64_t bitrate,
-                                       int fps);
+                                       int fps
+#if SB_API_VERSION >= 10
+                                       ,
+                                       bool decode_to_texture_required
+#endif  // SB_API_VERSION >= 10
+                                       );
 
 // Indicates whether this platform supports |audio_codec| at |bitrate|.
 // If |audio_codec| is not supported under any condition, this function
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
index 386ddda..6cb6afe 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.cc
@@ -288,9 +288,11 @@
 }
 
 SbTime AudioRenderer::GetCurrentMediaTime(bool* is_playing,
-                                          bool* is_eos_played) {
+                                          bool* is_eos_played,
+                                          bool* is_underflow) {
   SB_DCHECK(is_playing);
   SB_DCHECK(is_eos_played);
+  SB_DCHECK(is_underflow);
 
   SbTime media_time = 0;
   SbTimeMonotonic now = -1;
@@ -303,6 +305,7 @@
 
     *is_playing = !paused_ && !seeking_;
     *is_eos_played = IsEndOfStreamPlayed_Locked();
+    *is_underflow = underflow_;
     if (*is_eos_played && !ended_cb_called_) {
       ended_cb_called_ = true;
       Schedule(ended_cb_);
@@ -463,10 +466,12 @@
   }
 
   is_eos_reached_on_sink_thread_ = eos_state_ >= kEOSSentToSink;
-  is_playing_on_sink_thread_ = !paused_ && !seeking_;
   frames_in_buffer_on_sink_thread_ = static_cast<int>(
       frames_sent_to_sink_ + silence_frames_written_after_eos_on_sink_thread_ -
       frames_consumed_by_sink_ - frames_consumed_on_sink_thread_);
+  underflow_ |=
+      frames_in_buffer_on_sink_thread_ < kFramesInBufferBeginUnderflow;
+  is_playing_on_sink_thread_ = !paused_ && !seeking_ && !underflow_;
   offset_in_frames_on_sink_thread_ =
       (frames_consumed_by_sink_ + frames_consumed_on_sink_thread_) %
       max_cached_frames_;
@@ -596,6 +601,7 @@
           seeking_ = false;
           Schedule(prerolled_cb_);
         }
+        underflow_ = false;
       }
 
       resampled_audio = resampler_->WriteEndOfStream();
@@ -643,10 +649,13 @@
 
   *is_frame_buffer_full = false;
 
-  if (seeking_ && time_stretcher_.IsQueueFull()) {
+  if (time_stretcher_.IsQueueFull()) {
     ScopedLock lock(mutex_);
-    seeking_ = false;
-    Schedule(prerolled_cb_);
+    if (seeking_) {
+      seeking_ = false;
+      Schedule(prerolled_cb_);
+    }
+    underflow_ = false;
   }
 
   if (seeking_ || playback_rate_ == 0.0) {
diff --git a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
index 09f9da4..b25e959 100644
--- a/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
+++ b/src/starboard/shared/starboard/player/filter/audio_renderer_internal.h
@@ -45,6 +45,8 @@
 namespace player {
 namespace filter {
 
+const int kFramesInBufferBeginUnderflow = 1024;
+
 // A class that sits in between the audio decoder, the audio sink and the
 // pipeline to coordinate data transfer between these parties.  It also serves
 // as the authority of playback time.
@@ -86,7 +88,9 @@
   void Pause() override;
   void SetPlaybackRate(double playback_rate) override;
   void Seek(SbTime seek_to_time) override;
-  SbTime GetCurrentMediaTime(bool* is_playing, bool* is_eos_played) override;
+  SbTime GetCurrentMediaTime(bool* is_playing,
+                             bool* is_eos_played,
+                             bool* is_underflow) override;
 
  private:
   enum EOSState {
@@ -185,6 +189,10 @@
   SbTime max_drift_ = 0;
   int64_t total_frames_consumed_ = 0;
 #endif  // SB_LOG_MEDIA_TIME_STATS
+
+  // Set to true when there are fewer than |kFramesInBufferBeginUnderflow|
+  // frames in buffer. Set to false when the queue is full or EOS.
+  bool underflow_ = false;
 };
 
 }  // namespace filter
diff --git a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index 492b272..099710e 100644
--- a/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/src/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -462,9 +462,10 @@
     }
     bool is_playing;
     bool is_eos_played;
+    bool is_underflow;
     auto media_time = GetMediaTimeProvider()->GetCurrentMediaTime(
-        &is_playing, &is_eos_played);
-    update_media_info_cb_(media_time, dropped_frames);
+        &is_playing, &is_eos_played, &is_underflow);
+    update_media_info_cb_(media_time, dropped_frames, is_underflow);
   }
 
   update_job_token_ = Schedule(update_job_, kUpdateInterval);
diff --git a/src/starboard/shared/starboard/player/filter/media_time_provider.h b/src/starboard/shared/starboard/player/filter/media_time_provider.h
index d6be5c2..55a71d6 100644
--- a/src/starboard/shared/starboard/player/filter/media_time_provider.h
+++ b/src/starboard/shared/starboard/player/filter/media_time_provider.h
@@ -34,7 +34,9 @@
   virtual void SetPlaybackRate(double playback_rate) = 0;
   virtual void Seek(SbTime seek_to_pts) = 0;
   // This function can be called from *any* thread.
-  virtual SbTime GetCurrentMediaTime(bool* is_playing, bool* is_eos_played) = 0;
+  virtual SbTime GetCurrentMediaTime(bool* is_playing,
+                                     bool* is_eos_played,
+                                     bool* is_underflow) = 0;
 
  protected:
   virtual ~MediaTimeProvider() {}
diff --git a/src/starboard/shared/starboard/player/filter/media_time_provider_impl.cc b/src/starboard/shared/starboard/player/filter/media_time_provider_impl.cc
index b15e7e0..5134d8b 100644
--- a/src/starboard/shared/starboard/player/filter/media_time_provider_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/media_time_provider_impl.cc
@@ -94,7 +94,8 @@
 }
 
 SbTime MediaTimeProviderImpl::GetCurrentMediaTime(bool* is_playing,
-                                                  bool* is_eos_played) {
+                                                  bool* is_eos_played,
+                                                  bool* is_underflow) {
   SB_DCHECK(ended_cb_);
 
   ScopedLock scoped_lock(mutex_);
@@ -105,6 +106,7 @@
   *is_eos_played =
       is_video_end_of_stream_reached_ &&
       (!video_duration_.has_engaged() || current >= video_duration_.value());
+  *is_underflow = false;
 
   Schedule(ended_cb_);
   return current;
diff --git a/src/starboard/shared/starboard/player/filter/media_time_provider_impl.h b/src/starboard/shared/starboard/player/filter/media_time_provider_impl.h
index 1da38e5..77cd1fa 100644
--- a/src/starboard/shared/starboard/player/filter/media_time_provider_impl.h
+++ b/src/starboard/shared/starboard/player/filter/media_time_provider_impl.h
@@ -49,7 +49,9 @@
   void Pause() override;
   void SetPlaybackRate(double playback_rate) override;
   void Seek(SbTime seek_to_time) override;
-  SbTime GetCurrentMediaTime(bool* is_playing, bool* is_eos_played) override;
+  SbTime GetCurrentMediaTime(bool* is_playing,
+                             bool* is_eos_played,
+                             bool* is_underflow) override;
 
   // When video end of stream is reached and the current media time passes the
   // video duration, |is_eos_played| of GetCurrentMediaTime() will return true.
diff --git a/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc b/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
index 6d7ecbb..a76aa73 100644
--- a/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
@@ -255,7 +255,9 @@
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
   bool is_playing = true;
   bool is_eos_played = true;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow = true;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
@@ -279,7 +281,9 @@
 
   bool is_playing = true;
   bool is_eos_played = true;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow = true;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
@@ -289,8 +293,8 @@
 
   SendDecoderOutput(new DecodedAudio);
 
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
 
@@ -312,8 +316,8 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
   EXPECT_GT(new_media_time, media_time);
@@ -321,8 +325,8 @@
 
   const int remaining_frames = frames_in_buffer - frames_to_consume;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_TRUE(is_eos_played);
   EXPECT_GT(new_media_time, media_time);
@@ -357,8 +361,10 @@
   FillRendererWithDecodedAudioAndWriteEOS();
   bool is_playing = false;
   bool is_eos_played = true;
+  bool is_underflow = true;
 
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
@@ -368,8 +374,8 @@
 
   SendDecoderOutput(new DecodedAudio);
 
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
 
   int frames_in_buffer;
   int offset_in_frames;
@@ -390,15 +396,15 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GT(new_media_time, media_time);
   media_time = new_media_time;
 
   const int remaining_frames = frames_in_buffer - frames_to_consume;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GT(new_media_time, media_time);
 
   EXPECT_TRUE(audio_renderer_->IsEndOfStreamPlayed());
@@ -425,8 +431,9 @@
 
   bool is_playing = false;
   bool is_eos_played = true;
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  bool is_underflow = true;
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
 
   int frames_in_buffer;
   int offset_in_frames;
@@ -446,8 +453,8 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
   EXPECT_GE(new_media_time, media_time);
@@ -455,8 +462,8 @@
 
   const int remaining_frames = frames_in_buffer - frames_to_consume;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_TRUE(is_eos_played);
   EXPECT_GE(new_media_time, media_time);
@@ -492,7 +499,9 @@
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
   bool is_playing = true;
   bool is_eos_played = false;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow = true;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_TRUE(is_eos_played);
@@ -534,7 +543,9 @@
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
   bool is_playing = true;
   bool is_eos_played = false;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow = true;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_TRUE(is_eos_played);
@@ -572,7 +583,9 @@
 
   bool is_playing = true;
   bool is_eos_played = true;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow = true;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
@@ -582,8 +595,8 @@
 
   SendDecoderOutput(new DecodedAudio);
 
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
 
   int frames_in_buffer;
   int offset_in_frames;
@@ -604,8 +617,8 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
   EXPECT_GE(new_media_time, media_time);
@@ -613,8 +626,8 @@
 
   const int remaining_frames = frames_in_buffer - frames_to_consume;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_TRUE(is_eos_played);
   EXPECT_GE(new_media_time, media_time);
@@ -661,7 +674,9 @@
 
   bool is_playing;
   bool is_eos_played;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
 
@@ -669,8 +684,8 @@
 
   SendDecoderOutput(new DecodedAudio);
 
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
 
   int frames_in_buffer;
   int offset_in_frames;
@@ -690,15 +705,15 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GE(new_media_time, media_time);
   media_time = new_media_time;
 
   const int remaining_frames = frames_in_buffer - frames_to_consume;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GE(new_media_time, media_time);
 
   EXPECT_TRUE(audio_renderer_->IsEndOfStreamPlayed());
@@ -726,7 +741,9 @@
 
   bool is_playing;
   bool is_eos_played;
-  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  bool is_underflow;
+  EXPECT_EQ(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             0);
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
 
@@ -734,8 +751,8 @@
 
   SendDecoderOutput(new DecodedAudio);
 
-  SbTime media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  SbTime media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
 
   int frames_in_buffer;
   int offset_in_frames;
@@ -756,14 +773,15 @@
   EXPECT_FALSE(audio_renderer_->IsEndOfStreamPlayed());
 
   renderer_callback_->ConsumeFrames(frames_to_consume);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GE(new_media_time, media_time);
   Seek(seek_time);
 
   frames_written = FillRendererWithDecodedAudioAndWriteEOS();
 
-  EXPECT_GE(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played),
+  EXPECT_GE(audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                 &is_underflow),
             seek_time);
   EXPECT_FALSE(audio_renderer_->IsSeekingInProgress());
 
@@ -778,8 +796,8 @@
   EXPECT_TRUE(is_eos_reached);
   const int remaining_frames = frames_in_buffer - offset_in_frames;
   renderer_callback_->ConsumeFrames(remaining_frames);
-  new_media_time =
-      audio_renderer_->GetCurrentMediaTime(&is_playing, &is_eos_played);
+  new_media_time = audio_renderer_->GetCurrentMediaTime(
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_GE(new_media_time, seek_time);
 
   EXPECT_TRUE(audio_renderer_->IsEndOfStreamPlayed());
diff --git a/src/starboard/shared/starboard/player/filter/testing/media_time_provider_impl_test.cc b/src/starboard/shared/starboard/player/filter/testing/media_time_provider_impl_test.cc
index ab23eea..9c1637e 100644
--- a/src/starboard/shared/starboard/player/filter/testing/media_time_provider_impl_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/media_time_provider_impl_test.cc
@@ -102,64 +102,68 @@
 };
 
 TEST_F(MediaTimeProviderImplTest, DefaultStates) {
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           0));
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 }
 
 TEST_F(MediaTimeProviderImplTest, GetCurrentMediaTimeWhileNotPlaying) {
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           0));
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 }
 
 TEST_F(MediaTimeProviderImplTest, GetCurrentMediaTimeWhilePlaying) {
   media_time_provider_impl_.Play();
 
-  bool is_playing = false, is_eos_played = true;
+  bool is_playing = false, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           0));
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSbTimeSecond));
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 }
 
 TEST_F(MediaTimeProviderImplTest, SetPlaybackRateWhilePlaying) {
   media_time_provider_impl_.Play();
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSbTimeSecond));
 
   media_time_provider_impl_.SetPlaybackRate(2.0);
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSbTimeSecond * 3));
 
   media_time_provider_impl_.SetPlaybackRate(0.0);
   system_time_provider_->AdvanceTime(kSbTimeSecond);
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSbTimeSecond * 3));
 }
 
@@ -167,17 +171,18 @@
   const SbTime kSeekToTime = 100 * kSbTimeSecond;
 
   media_time_provider_impl_.Seek(kSeekToTime);
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSeekToTime));
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSeekToTime));
 }
 
@@ -187,20 +192,22 @@
   media_time_provider_impl_.Play();
 
   media_time_provider_impl_.Seek(kSeekToTime);
-  bool is_playing = false, is_eos_played = true;
+  bool is_playing = false, is_eos_played = true, is_underflow = true;
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSeekToTime));
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSeekToTime + kSbTimeSecond));
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 }
 
 TEST_F(MediaTimeProviderImplTest, SeekBackwardWhilePlaying) {
@@ -208,14 +215,15 @@
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   // Query for media time and ignore the result.
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
 
   const SbTime kSeekToTime = 0;
   media_time_provider_impl_.Seek(kSeekToTime);
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSeekToTime));
 }
 
@@ -224,20 +232,21 @@
 
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   // Query for media time and ignore the result.
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
 
   media_time_provider_impl_.Pause();
   system_time_provider_->AdvanceTime(kSbTimeSecond);
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           kSbTimeSecond));
 
   media_time_provider_impl_.Seek(0);
   system_time_provider_->AdvanceTime(kSbTimeSecond);
   EXPECT_TRUE(AlmostEqual(media_time_provider_impl_.GetCurrentMediaTime(
-                              &is_playing, &is_eos_played),
+                              &is_playing, &is_eos_played, &is_underflow),
                           0));
 }
 
@@ -248,36 +257,45 @@
   media_time_provider_impl_.UpdateVideoDuration(kVideoDuration);
   system_time_provider_->AdvanceTime(kSbTimeSecond);
 
-  bool is_playing = true, is_eos_played = true;
+  bool is_playing = true, is_eos_played = true, is_underflow = true;
   // Query for media time and ignore the result.
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   media_time_provider_impl_.Play();
   // Advance to 1 millisecond past the |kVideoDuration|.
   system_time_provider_->AdvanceTime(kSbTimeSecond + kSbTimeMillisecond);
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   media_time_provider_impl_.VideoEndOfStreamReached();
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
   EXPECT_TRUE(is_playing);
   EXPECT_TRUE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   media_time_provider_impl_.Pause();
   media_time_provider_impl_.SetPlaybackRate(0);
   SbTime current_time = media_time_provider_impl_.GetCurrentMediaTime(
-      &is_playing, &is_eos_played);
+      &is_playing, &is_eos_played, &is_underflow);
   EXPECT_FALSE(is_playing);
   EXPECT_TRUE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 
   // Seek() should clear the EOS state
   media_time_provider_impl_.Seek(current_time);
-  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played);
+  media_time_provider_impl_.GetCurrentMediaTime(&is_playing, &is_eos_played,
+                                                &is_underflow);
   EXPECT_FALSE(is_playing);
   EXPECT_FALSE(is_eos_played);
+  EXPECT_FALSE(is_underflow);
 }
 
 }  // namespace
diff --git a/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc b/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
index 7d06873..12622c5 100644
--- a/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
+++ b/src/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
@@ -646,7 +646,12 @@
       if (SbMediaIsVideoSupported(
               dmp_reader.video_codec(), video_sample_info->frame_width,
               video_sample_info->frame_height, dmp_reader.video_bitrate(),
-              dmp_reader.video_fps())) {
+              dmp_reader.video_fps()
+#if SB_API_VERSION >= 10
+                  ,
+              false
+#endif  // SB_API_VERSION >= 10
+              )) {
         test_params.push_back({output_mode, filename});
       }
     }
diff --git a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
index 157b2c4..b54a451 100644
--- a/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
+++ b/src/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
@@ -42,8 +42,9 @@
 
   bool is_audio_playing;
   bool is_audio_eos_played;
+  bool is_underflow;
   SbTime media_time = media_time_provider->GetCurrentMediaTime(
-      &is_audio_playing, &is_audio_eos_played);
+      &is_audio_playing, &is_audio_eos_played, &is_underflow);
 
   // Video frames are synced to the audio timestamp. However, the audio
   // timestamp is not queried at a consistent interval. For example, if the
diff --git a/src/starboard/shared/starboard/player/player_create.cc b/src/starboard/shared/starboard/player/player_create.cc
index be82162..725a021 100644
--- a/src/starboard/shared/starboard/player/player_create.cc
+++ b/src/starboard/shared/starboard/player/player_create.cc
@@ -80,7 +80,12 @@
   if (video_codec != kSbMediaVideoCodecNone &&
       !SbMediaIsVideoSupported(video_codec, kDefaultFrameWidth,
                                kDefaultFrameHeight, kDefaultBitRate,
-                               kDefaultFrameRate)) {
+                               kDefaultFrameRate
+#if SB_API_VERSION >= 10
+                               ,
+                               output_mode == kSbPlayerOutputModeDecodeToTexture
+#endif
+                               )) {
     SB_LOG(ERROR) << "Unsupported video codec " << video_codec;
     return kSbPlayerInvalid;
   }
diff --git a/src/starboard/shared/starboard/player/player_internal.cc b/src/starboard/shared/starboard/player/player_internal.cc
index a5898bc..27e2bbc 100644
--- a/src/starboard/shared/starboard/player/player_internal.cc
+++ b/src/starboard/shared/starboard/player/player_internal.cc
@@ -24,6 +24,7 @@
 using std::placeholders::_1;
 using std::placeholders::_2;
 using std::placeholders::_3;
+using std::placeholders::_4;
 
 SbTime GetMediaTime(SbTime media_time,
                     SbTimeMonotonic media_time_update_time,
@@ -49,21 +50,12 @@
     starboard::scoped_ptr<PlayerWorker::Handler> player_worker_handler)
     : sample_deallocate_func_(sample_deallocate_func),
       context_(context),
-      ticket_(SB_PLAYER_INITIAL_TICKET),
-      media_time_(0),
       media_time_updated_at_(SbTimeGetMonotonicNow()),
-      frame_width_(0),
-      frame_height_(0),
-      is_paused_(false),
-      playback_rate_(1.0),
-      volume_(1.0),
-      total_video_frames_(0),
-      dropped_video_frames_(0),
       worker_(new PlayerWorker(
           audio_codec,
           video_codec,
           player_worker_handler.Pass(),
-          std::bind(&SbPlayerPrivate::UpdateMediaInfo, this, _1, _2, _3),
+          std::bind(&SbPlayerPrivate::UpdateMediaInfo, this, _1, _2, _3, _4),
           decoder_status_func,
           player_status_func,
 #if SB_HAS(PLAYER_ERROR_MESSAGE)
@@ -128,7 +120,7 @@
   starboard::ScopedLock lock(mutex_);
 #if SB_API_VERSION < 10
   out_player_info->duration_pts = SB_PLAYER_NO_DURATION;
-  if (is_paused_) {
+  if (is_paused_ || underflow_) {
     out_player_info->current_media_pts = SB_TIME_TO_SB_MEDIA_TIME(media_time_);
   } else {
     out_player_info->current_media_pts = SB_TIME_TO_SB_MEDIA_TIME(
@@ -136,7 +128,7 @@
   }
 #else   // SB_API_VERSION < 10
   out_player_info->duration = SB_PLAYER_NO_DURATION;
-  if (is_paused_) {
+  if (is_paused_ || underflow_) {
     out_player_info->current_media_timestamp = media_time_;
   } else {
     out_player_info->current_media_timestamp =
@@ -171,12 +163,14 @@
 
 void SbPlayerPrivate::UpdateMediaInfo(SbTime media_time,
                                       int dropped_video_frames,
-                                      int ticket) {
+                                      int ticket,
+                                      bool underflow) {
   starboard::ScopedLock lock(mutex_);
   if (ticket_ != ticket) {
     return;
   }
   media_time_ = media_time;
+  underflow_ = underflow;
   media_time_updated_at_ = SbTimeGetMonotonicNow();
   dropped_video_frames_ = dropped_video_frames;
 }
diff --git a/src/starboard/shared/starboard/player/player_internal.h b/src/starboard/shared/starboard/player/player_internal.h
index bd568c1..8e2064c 100644
--- a/src/starboard/shared/starboard/player/player_internal.h
+++ b/src/starboard/shared/starboard/player/player_internal.h
@@ -67,22 +67,26 @@
   static int number_of_players() { return number_of_players_; }
 
  private:
-  void UpdateMediaInfo(SbTime media_time, int dropped_video_frames, int ticket);
+  void UpdateMediaInfo(SbTime media_time,
+                       int dropped_video_frames,
+                       int ticket,
+                       bool underflow);
 
   SbPlayerDeallocateSampleFunc sample_deallocate_func_;
   void* context_;
 
   starboard::Mutex mutex_;
-  int ticket_;
-  SbTime media_time_;
+  int ticket_ = SB_PLAYER_INITIAL_TICKET;
+  SbTime media_time_ = 0;
   SbTimeMonotonic media_time_updated_at_;
-  int frame_width_;
-  int frame_height_;
-  bool is_paused_;
-  double playback_rate_;
-  double volume_;
-  int total_video_frames_;
-  int dropped_video_frames_;
+  int frame_width_ = 0;
+  int frame_height_ = 0;
+  bool is_paused_ = false;
+  double playback_rate_ = 1.0;
+  double volume_ = 1.0;
+  int total_video_frames_ = 0;
+  int dropped_video_frames_ = 0;
+  bool underflow_ = false;
 
   starboard::scoped_ptr<PlayerWorker> worker_;
 
diff --git a/src/starboard/shared/starboard/player/player_worker.cc b/src/starboard/shared/starboard/player/player_worker.cc
index 569fcd7..a55680d 100644
--- a/src/starboard/shared/starboard/player/player_worker.cc
+++ b/src/starboard/shared/starboard/player/player_worker.cc
@@ -30,6 +30,7 @@
 
 using std::placeholders::_1;
 using std::placeholders::_2;
+using std::placeholders::_3;
 
 // 8 ms is enough to ensure that DoWritePendingSamples() is called twice for
 // every frame in HFR.
@@ -101,8 +102,10 @@
   // effects are gone.
 }
 
-void PlayerWorker::UpdateMediaInfo(SbTime time, int dropped_video_frames) {
-  update_media_info_cb_(time, dropped_video_frames, ticket_);
+void PlayerWorker::UpdateMediaInfo(SbTime time,
+                                   int dropped_video_frames,
+                                   bool underflow) {
+  update_media_info_cb_(time, dropped_video_frames, ticket_, underflow);
 }
 
 void PlayerWorker::UpdatePlayerState(SbPlayerState player_state) {
@@ -178,11 +181,11 @@
   update_player_error_cb =
       std::bind(&PlayerWorker::UpdatePlayerError, this, _1, _2);
 #endif  // SB_HAS(PLAYER_ERROR_MESSAGE)
-  if (handler_->Init(player_,
-                     std::bind(&PlayerWorker::UpdateMediaInfo, this, _1, _2),
-                     std::bind(&PlayerWorker::player_state, this),
-                     std::bind(&PlayerWorker::UpdatePlayerState, this, _1),
-                     update_player_error_cb)) {
+  if (handler_->Init(
+          player_, std::bind(&PlayerWorker::UpdateMediaInfo, this, _1, _2, _3),
+          std::bind(&PlayerWorker::player_state, this),
+          std::bind(&PlayerWorker::UpdatePlayerState, this, _1),
+          update_player_error_cb)) {
     UpdatePlayerState(kSbPlayerStateInitialized);
   } else {
 #if SB_HAS(PLAYER_ERROR_MESSAGE)
diff --git a/src/starboard/shared/starboard/player/player_worker.h b/src/starboard/shared/starboard/player/player_worker.h
index 3d04779..1c5b6c4 100644
--- a/src/starboard/shared/starboard/player/player_worker.h
+++ b/src/starboard/shared/starboard/player/player_worker.h
@@ -43,8 +43,10 @@
 // they needn't maintain the thread and queue internally.
 class PlayerWorker {
  public:
-  typedef std::function<
-      void(SbTime media_time, int dropped_video_frames, int ticket)>
+  typedef std::function<void(SbTime media_time,
+                             int dropped_video_frames,
+                             int ticket,
+                             bool underflow)>
       UpdateMediaInfoCB;
 
   struct Bounds {
@@ -58,7 +60,8 @@
   // All functions of this class will be called from the JobQueue thread.
   class Handler {
    public:
-    typedef std::function<void(SbTime media_time, int dropped_video_frames)>
+    typedef std::function<
+        void(SbTime media_time, int dropped_video_frames, bool underflow)>
         UpdateMediaInfoCB;
     typedef std::function<SbPlayerState()> GetPlayerStateCB;
     typedef std::function<void(SbPlayerState player_state)> UpdatePlayerStateCB;
@@ -158,7 +161,7 @@
   }
 
  private:
-  void UpdateMediaInfo(SbTime time, int dropped_video_frames);
+  void UpdateMediaInfo(SbTime time, int dropped_video_frames, bool underflow);
 
   SbPlayerState player_state() const { return player_state_; }
   void UpdatePlayerState(SbPlayerState player_state);
diff --git a/src/starboard/shared/stub/media_is_video_supported.cc b/src/starboard/shared/stub/media_is_video_supported.cc
index 47dc4f4..47501fd 100644
--- a/src/starboard/shared/stub/media_is_video_supported.cc
+++ b/src/starboard/shared/stub/media_is_video_supported.cc
@@ -20,6 +20,11 @@
                                        int /*frame_width*/,
                                        int /*frame_height*/,
                                        int64_t /*bitrate*/,
-                                       int /*fps*/) {
+                                       int /*fps*/
+#if SB_API_VERSION >= 10
+                                       ,
+                                       bool /*decode_to_texture_required*/
+#endif                                      // SB_API_VERSION >= 10
+                                       ) {
   return false;
 }
diff --git a/src/starboard/shared/widevine/drm_create_system.cc b/src/starboard/shared/widevine/drm_create_system.cc
new file mode 100644
index 0000000..0ede5c2
--- /dev/null
+++ b/src/starboard/shared/widevine/drm_create_system.cc
@@ -0,0 +1,80 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/drm.h"
+
+#include "starboard/log.h"
+#include "starboard/shared/widevine/drm_system_widevine.h"
+#include "starboard/string.h"
+
+#warning "This implementation is meant to use for testing purpose only."
+#warning "|company_name| and |model_name| should be replaced in production."
+
+namespace {
+const char kCompanyName[] = "www";
+const char kModelName[] = "www";
+}  // namespace
+
+SbDrmSystem SbDrmCreateSystem(
+    const char* key_system,
+    void* context,
+    SbDrmSessionUpdateRequestFunc update_request_callback,
+    SbDrmSessionUpdatedFunc session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+    ,
+    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+    ,
+    SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
+    SbDrmSessionClosedFunc session_closed_callback
+#endif  // SB_API_VERSION >= 10
+    ) {
+  using starboard::shared::widevine::DrmSystemWidevine;
+  if (!update_request_callback || !session_updated_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#if SB_HAS(DRM_KEY_STATUSES)
+  if (!key_statuses_changed_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+  if (!server_certificate_updated_callback || !session_closed_callback) {
+    return kSbDrmSystemInvalid;
+  }
+#endif  // SB_API_VERSION >= 10
+  if (!DrmSystemWidevine::IsKeySystemSupported()) {
+    SB_DLOG(WARNING) << "Invalid key system " << key_system;
+    return kSbDrmSystemInvalid;
+  }
+  SB_LOG(ERROR) << "|company_name| and |model_name| are set to \"www\", "
+                << "premium content playback resolution may be limited.";
+  return new DrmSystemWidevine(context, update_request_callback,
+                               session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+                               ,
+                               key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+                               ,
+                               server_certificate_updated_callback
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+                               ,
+                               session_closed_callback
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+                               ,
+                               kCompanyName, kModelName);
+}
diff --git a/src/starboard/shared/widevine/drm_is_server_certificate_updatable.cc b/src/starboard/shared/widevine/drm_is_server_certificate_updatable.cc
new file mode 100644
index 0000000..91d17dd
--- /dev/null
+++ b/src/starboard/shared/widevine/drm_is_server_certificate_updatable.cc
@@ -0,0 +1,25 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/drm.h"
+
+#if SB_API_VERSION >= 10
+
+bool SbDrmIsServerCertificateUpdatable(SbDrmSystem drm_system) {
+  SB_UNREFERENCED_PARAMETER(drm_system);
+
+  return true;
+}
+
+#endif  // SB_API_VERSION >= 10
diff --git a/src/starboard/shared/widevine/drm_system_widevine.cc b/src/starboard/shared/widevine/drm_system_widevine.cc
new file mode 100644
index 0000000..dda2d03
--- /dev/null
+++ b/src/starboard/shared/widevine/drm_system_widevine.cc
@@ -0,0 +1,691 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/widevine/drm_system_widevine.h"
+
+#include <vector>
+
+#include "starboard/character.h"
+#include "starboard/log.h"
+#include "starboard/memory.h"
+#include "starboard/mutex.h"
+#include "starboard/once.h"
+#include "starboard/shared/widevine/widevine_storage.h"
+#include "starboard/shared/widevine/widevine_timer.h"
+#include "starboard/string.h"
+#include "starboard/time.h"
+#include "third_party/ce_cdm/core/include/log.h"  // for wvcdm::InitLogging();
+#include "third_party/ce_cdm/core/include/string_conversions.h"
+
+using wv3cdm = ::widevine::Cdm;
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+namespace {
+
+const int kInitializationVectorSize = 16;
+const char* kWidevineKeySystem[] = {"com.widevine", "com.widevine.alpha"};
+const char kWidevineStorageFileName[] = "wvcdm.dat";
+
+class WidevineClock : public wv3cdm::IClock {
+ public:
+  int64_t now() override {
+    return SbTimeToPosix(SbTimeGetNow()) / kSbTimeMillisecond;
+  }
+};
+
+std::string GetWidevineStoragePath() {
+  char path[SB_FILE_MAX_PATH + 1] = {0};
+  auto path_size = SB_ARRAY_SIZE_INT(path);
+  SB_CHECK(SbSystemGetPath(kSbSystemPathCacheDirectory, path, path_size) &&
+           SbStringConcat(path, SB_FILE_SEP_STRING, path_size) &&
+           SbStringConcat(path, kWidevineStorageFileName, path_size));
+  return path;
+}
+
+// Converts |::widevine::Cdm::KeyStatus| to starboard's |SbDrmKeyStatus|
+// Note: there is no mapping from any Widevine's Cdm::KeyStatus to
+// starboard's kSbDrmKeyStatusDownscaled.
+SbDrmKeyStatus CdmKeyStatusToSbDrmKeyStatus(
+    const wv3cdm::KeyStatus key_status) {
+  switch (key_status) {
+    case wv3cdm::kUsable:
+      return kSbDrmKeyStatusUsable;
+    case wv3cdm::kExpired:
+      return kSbDrmKeyStatusExpired;
+    case wv3cdm::kOutputRestricted:
+      return kSbDrmKeyStatusRestricted;
+    case wv3cdm::kStatusPending:
+      return kSbDrmKeyStatusPending;
+    case wv3cdm::kInternalError:
+      return kSbDrmKeyStatusError;
+    case wv3cdm::kReleased:
+      return kSbDrmKeyStatusReleased;
+    default:
+      SB_NOTREACHED();
+  }
+  return kSbDrmKeyStatusError;
+}
+
+// Converts |::widevine::Cdm::Status| to starboard's |SbDrmStatus|
+// Note: there is no mapping for few Widevine's Cdm::Status-es that
+// just converted here to starboard's kSbDrmStatusUnknownError.
+SbDrmStatus CdmStatusToSbDrmStatus(const wv3cdm::Status status) {
+  switch (status) {
+    case wv3cdm::kSuccess:
+      return kSbDrmStatusSuccess;
+    case wv3cdm::kTypeError:
+      return kSbDrmStatusTypeError;
+    case wv3cdm::kNotSupported:
+      return kSbDrmStatusNotSupportedError;
+    case wv3cdm::kInvalidState:
+      return kSbDrmStatusInvalidStateError;
+    case wv3cdm::kQuotaExceeded:
+      return kSbDrmStatusQuotaExceededError;
+    case wv3cdm::kNeedsDeviceCertificate:
+    case wv3cdm::kSessionNotFound:
+    case wv3cdm::kDecryptError:
+    case wv3cdm::kNoKey:
+    case wv3cdm::kKeyUsageBlockedByPolicy:
+    case wv3cdm::kRangeError:
+    case wv3cdm::kDeferred:
+    case wv3cdm::kUnexpectedError:
+      return kSbDrmStatusUnknownError;
+    default:
+      SB_NOTREACHED();
+  }
+  return kSbDrmStatusUnknownError;
+}
+
+SB_ONCE_INITIALIZE_FUNCTION(Mutex, GetInitializationMutex);
+
+void EnsureWidevineCdmIsInitialized(const std::string& company_name,
+                                    const std::string& model_name) {
+  static WidevineClock s_clock;
+  static WidevineStorage s_storage(GetWidevineStoragePath());
+  static WidevineTimer s_timer;
+  static bool s_initialized = false;
+
+  ScopedLock scoped_lock(*GetInitializationMutex());
+
+  if (s_initialized) {
+    return;
+  }
+
+  wvcdm::InitLogging();
+
+  wv3cdm::ClientInfo client_info;
+
+  client_info.product_name = "Cobalt";
+  client_info.company_name = company_name;
+  client_info.device_name = "";
+  client_info.model_name = model_name;
+  client_info.arch_name = "";
+  client_info.build_info = wv3cdm::version();
+
+  SB_LOG(INFO) << "Initialize wvcdm using product_name: \""
+               << client_info.product_name << "\", company_name: \""
+               << client_info.company_name << "\", and model_name: \""
+               << client_info.model_name << "\".";
+
+  auto log_level = wv3cdm::kInfo;
+#if COBALT_BUILD_TYPE_GOLD
+  log_level = wv3cdm::kSilent;
+#endif  // COBALT_BUILD_TYPE_GOLD
+  wv3cdm::Status status =
+      wv3cdm::initialize(wv3cdm::kNoSecureOutput, client_info, &s_storage,
+                         &s_clock, &s_timer, log_level);
+  SB_DCHECK(status == wv3cdm::kSuccess);
+  s_initialized = true;
+}
+
+}  // namespace
+
+// static
+const char DrmSystemWidevine::kFirstSbDrmSessionId[] = "initialdrmsessionid";
+
+DrmSystemWidevine::DrmSystemWidevine(
+    void* context,
+    SbDrmSessionUpdateRequestFunc session_update_request_callback,
+    SbDrmSessionUpdatedFunc session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+    ,
+    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+    ,
+    SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+    ,
+    SbDrmSessionClosedFunc session_closed_callback
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+    ,
+    const std::string& company_name,
+    const std::string& model_name)
+    : context_(context),
+      session_update_request_callback_(session_update_request_callback),
+      session_updated_callback_(session_updated_callback),
+#if SB_HAS(DRM_KEY_STATUSES)
+      key_statuses_changed_callback_(key_statuses_changed_callback),
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+      server_certificate_updated_callback_(server_certificate_updated_callback),
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+      session_closed_callback_(session_closed_callback),
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+      ticket_thread_id_(SbThreadGetId()) {
+  SB_DCHECK(!company_name.empty());
+  SB_DCHECK(!model_name.empty());
+  EnsureWidevineCdmIsInitialized(company_name, model_name);
+#if SB_API_VERSION >= 10
+  const bool kEnablePrivacyMode = true;
+#else   // SB_API_VERSION >= 10
+  const bool kEnablePrivacyMode = false;
+#endif  // SB_API_VERSION >= 10
+  cdm_.reset(wv3cdm::create(this, NULL, kEnablePrivacyMode));
+  SB_DCHECK(cdm_);
+}
+
+DrmSystemWidevine::~DrmSystemWidevine() {}
+
+// static
+bool DrmSystemWidevine::IsKeySystemSupported(const char* key_system) {
+  for (auto wv_key_system : kWidevineKeySystem) {
+    if (SbStringCompareAll(key_system, wv_key_system) == 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+void DrmSystemWidevine::GenerateSessionUpdateRequest(
+    int ticket,
+    const char* type,
+    const void* initialization_data,
+    int initialization_data_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  const std::string init_str(static_cast<const char*>(initialization_data),
+                             initialization_data_size);
+  wv3cdm::InitDataType init_type = wv3cdm::kWebM;
+  if (SbStringCompareAll("cenc", type) == 0) {
+    init_type = wv3cdm::kCenc;
+  } else if (SbStringCompareAll("webm", type) == 0) {
+    init_type = wv3cdm::kWebM;
+  } else {
+    SB_NOTREACHED();
+  }
+
+  if (!is_server_certificate_set_) {
+    // When privacy mode is on and server certificate hasn't been set yet for
+    // the current playback, save the requests and send a server certificate
+    // request instead.
+    bool first_request = pending_generate_session_update_requests_.empty();
+    GenerateSessionUpdateRequestData request_data = {
+        first_request ? kSbDrmTicketInvalid : ticket, init_type, init_str};
+    pending_generate_session_update_requests_.push_back(request_data);
+    if (first_request) {
+      SendServerCertificateRequest(ticket);
+    }
+    return;
+  }
+
+  GenerateSessionUpdateRequestInternal(ticket, init_type, init_str, false);
+}
+
+void DrmSystemWidevine::UpdateSession(int ticket,
+                                      const void* key,
+                                      int key_size,
+                                      const void* sb_drm_session_id,
+                                      int sb_drm_session_id_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  const std::string str_key(static_cast<const char*>(key), key_size);
+
+  wv3cdm::Status status;
+  if (!pending_generate_session_update_requests_.empty()) {
+    status = ProcessServerCertificateResponse(str_key);
+  } else {
+    const std::string wvcdm_session_id = SbDrmSessionIdToWvdmSessionId(
+        sb_drm_session_id, sb_drm_session_id_size);
+    status = cdm_->update(wvcdm_session_id, str_key);
+  }
+  SB_DLOG(INFO) << "Update keys status " << status;
+#if SB_API_VERSION >= 10
+  session_updated_callback_(this, context_, ticket,
+                            CdmStatusToSbDrmStatus(status), "",
+                            sb_drm_session_id, sb_drm_session_id_size);
+#else   // SB_API_VERSION >= 10
+  session_updated_callback_(this, context_, ticket, sb_drm_session_id,
+                            sb_drm_session_id_size, status == wv3cdm::kSuccess);
+#endif  // SB_API_VERSION >= 10
+
+  // It is possible that |key| actually contains a server certificate, in such
+  // case try to process the pending GenerateSessionUpdateRequest() calls.
+  TrySendPendingGenerateSessionUpdateRequests();
+}
+
+void DrmSystemWidevine::CloseSession(const void* sb_drm_session_id,
+                                     int sb_drm_session_id_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  const std::string wvcdm_session_id =
+      SbDrmSessionIdToWvdmSessionId(sb_drm_session_id, sb_drm_session_id_size);
+  cdm_->close(wvcdm_session_id);
+}
+
+#if SB_API_VERSION >= 10
+void DrmSystemWidevine::UpdateServerCertificate(int ticket,
+                                                const void* certificate,
+                                                int certificate_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  const std::string str_certificate(static_cast<const char*>(certificate),
+                                    certificate_size);
+  wv3cdm::Status status = cdm_->setServiceCertificate(str_certificate);
+
+  is_server_certificate_set_ = (status == wv3cdm::kSuccess);
+
+  server_certificate_updated_callback_(this, context_, ticket,
+                                       CdmStatusToSbDrmStatus(status), "");
+}
+#endif  // SB_API_VERSION >= 10
+
+void IncrementIv(uint8_t* iv, size_t block_count) {
+  if (0 == block_count)
+    return;
+  uint8_t carry = 0;
+  uint8_t n = static_cast<uint8_t>(kInitializationVectorSize - 1);
+
+  while (n >= 8) {
+    uint32_t temp = block_count & 0xff;
+    temp += iv[n];
+    temp += carry;
+    iv[n] = temp & 0xff;
+    carry = (temp & 0x100) ? 1 : 0;
+    block_count = block_count >> 8;
+    n--;
+    if (0 == block_count && !carry) {
+      break;
+    }
+  }
+}
+
+SbDrmSystemPrivate::DecryptStatus DrmSystemWidevine::Decrypt(
+    InputBuffer* buffer) {
+  const SbDrmSampleInfo* drm_info = buffer->drm_info();
+
+  if (drm_info == NULL || drm_info->initialization_vector_size == 0) {
+    return kSuccess;
+  }
+
+  // Adapt |buffer| and |drm_info| to a |cdm::InputBuffer|.
+  SB_DCHECK(drm_info->initialization_vector_size == kInitializationVectorSize);
+  std::vector<uint8_t> initialization_vector(
+      drm_info->initialization_vector,
+      drm_info->initialization_vector + drm_info->initialization_vector_size);
+
+  wv3cdm::InputBuffer input;
+  input.data = buffer->data();
+  input.data_length = buffer->size();
+  input.block_offset = 0;
+  input.key_id = drm_info->identifier;
+  input.key_id_length = drm_info->identifier_size;
+  input.iv = initialization_vector.data();
+  input.iv_length = static_cast<uint32_t>(initialization_vector.size());
+  input.is_video = (buffer->sample_type() == kSbMediaTypeVideo);
+
+  std::vector<uint8_t> output_data(buffer->size());
+  wv3cdm::OutputBuffer output;
+  output.data = output_data.data();
+  output.data_length = output_data.size();
+
+  size_t block_counter = 0;
+  size_t encrypted_offset = 0;
+
+  for (size_t i = 0; i < buffer->drm_info()->subsample_count; i++) {
+    const SbDrmSubSampleMapping& subsample =
+        buffer->drm_info()->subsample_mapping[i];
+    if (subsample.clear_byte_count) {
+      input.last_subsample = i + 1 == buffer->drm_info()->subsample_count &&
+                             subsample.encrypted_byte_count == 0;
+      input.encryption_scheme = wv3cdm::EncryptionScheme::kClear;
+      input.data_length = subsample.clear_byte_count;
+
+      wv3cdm::Status status = cdm_->decrypt(input, output);
+      if (status != wv3cdm::kSuccess) {
+        if (status == wv3cdm::kNoKey) {
+          return kRetry;
+        }
+        SB_DLOG(ERROR) << "Decrypt status " << status;
+        SB_DLOG(ERROR) << "Key ID "
+                       << wvcdm::a2bs_hex(
+                              std::string(reinterpret_cast<const char*>(
+                                              &drm_info->identifier[0]),
+                                          drm_info->identifier_size));
+        return kFailure;
+      }
+
+      input.data += subsample.clear_byte_count;
+      output.data += subsample.clear_byte_count;
+      output.data_length -= subsample.clear_byte_count;
+      input.first_subsample = false;
+    }
+
+    if (subsample.encrypted_byte_count) {
+      input.last_subsample = i + 1 == buffer->drm_info()->subsample_count;
+      input.encryption_scheme = wv3cdm::EncryptionScheme::kAesCtr;
+      input.data_length = subsample.encrypted_byte_count;
+
+      wv3cdm::Status status = cdm_->decrypt(input, output);
+      if (status != wv3cdm::kSuccess) {
+        if (status == wv3cdm::kNoKey) {
+          SB_DLOG(ERROR) << "Decrypt status: kNoKey";
+          return kRetry;
+        }
+        SB_DLOG(ERROR) << "Decrypt status " << status;
+        SB_DLOG(ERROR) << "Key ID "
+                       << wvcdm::a2bs_hex(
+                              std::string(reinterpret_cast<const char*>(
+                                              &drm_info->identifier[0]),
+                                          drm_info->identifier_size));
+        return kFailure;
+      }
+
+      input.data += subsample.encrypted_byte_count;
+      output.data += subsample.encrypted_byte_count;
+      output.data_length -= subsample.encrypted_byte_count;
+
+      input.block_offset += subsample.encrypted_byte_count;
+      input.block_offset %= 16;
+
+      encrypted_offset += subsample.encrypted_byte_count;
+
+      // Increase initialization vector for CTR mode.
+      if (input.encryption_scheme == wv3cdm::kAesCtr) {
+        size_t new_block_counter = encrypted_offset / 16;
+        IncrementIv(initialization_vector.data(),
+                    new_block_counter - block_counter);
+        block_counter = new_block_counter;
+      }
+      input.first_subsample = false;
+    }
+  }
+
+  buffer->SetDecryptedContent(output_data.data(), output_data.size());
+  return kSuccess;
+}
+
+void DrmSystemWidevine::GenerateSessionUpdateRequestInternal(
+    int ticket,
+    wv3cdm::InitDataType init_data_type,
+    const std::string& initialization_data,
+    bool is_first_session) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  wv3cdm::SessionType session_type = wv3cdm::kTemporary;
+
+  std::string wvcdm_session_id;
+  // createSession() may return |kDeferred| if individualization is pending.
+  wv3cdm::Status status = cdm_->createSession(session_type, &wvcdm_session_id);
+
+  if (status == wv3cdm::kSuccess) {
+    // Ensure that the session id generated by the cdm is never the same as the
+    // fake id (kFirstSbDrmSessionId).
+    SB_DCHECK(wvcdm_session_id != kFirstSbDrmSessionId);
+    if (is_first_session) {
+      first_wvcdm_session_id_ = wvcdm_session_id;
+    }
+    SetTicket(WvdmSessionIdToSbDrmSessionId(wvcdm_session_id), ticket);
+    SB_DLOG(INFO) << "Calling generateRequest()";
+    status = cdm_->generateRequest(wvcdm_session_id, init_data_type,
+                                   initialization_data);
+    SB_DLOG(INFO) << "generateRequest() returns " << status;
+  } else {
+    // createSession() shouldn't return |kDeferred|, and if it does, the
+    // following if statement will incorrectly assume that there is a follow-up
+    // license request automatically generated after the individualization is
+    // finished, which won't happen.
+    SB_DCHECK(status != wv3cdm::kDeferred);
+  }
+
+  if (status != wv3cdm::kSuccess && status != wv3cdm::kDeferred) {
+    // Reset ticket before invoking user-provided callback to indicate that
+    // no session update request is pending.
+    SetTicket(WvdmSessionIdToSbDrmSessionId(wvcdm_session_id),
+              kSbDrmTicketInvalid);
+
+    SB_DLOG(ERROR) << "GenerateKeyRequest status " << status;
+// Send an empty request to signal an error.
+#if SB_API_VERSION >= 10
+    session_update_request_callback_(
+        this, context_, ticket, CdmStatusToSbDrmStatus(status),
+        kSbDrmSessionRequestTypeLicenseRequest, "", NULL, 0, NULL, 0, NULL);
+#else   // SB_API_VERSION >= 10
+    session_update_request_callback_(this, context_, ticket, NULL, 0, NULL, 0,
+                                     NULL);
+#endif  // SB_API_VERSION >= 10
+  }
+
+  // When |status| is |kDeferred|, it indicates that the cdm requires
+  // individualization.  In such case an individualization request may be sent
+  // if this is the first GenerateSessionUpdateRequest().  We won't send a
+  // generated key request now. Once the individualization response is received
+  // by the cdm, it will call |onMessage| for all pending sessions on the same
+  // thread.
+}
+
+void DrmSystemWidevine::onMessage(const std::string& wvcdm_session_id,
+                                  wv3cdm::MessageType message_type,
+                                  const std::string& message) {
+  const std::string sb_drm_session_id =
+      WvdmSessionIdToSbDrmSessionId(wvcdm_session_id);
+  switch (message_type) {
+    case wv3cdm::kLicenseRequest:
+      SendSessionUpdateRequest(kSbDrmSessionRequestTypeLicenseRequest,
+                               sb_drm_session_id, message);
+      break;
+    case wv3cdm::kLicenseRenewal:
+      SendSessionUpdateRequest(kSbDrmSessionRequestTypeLicenseRenewal,
+                               sb_drm_session_id, message);
+      break;
+    case wv3cdm::kLicenseRelease:
+      SendSessionUpdateRequest(kSbDrmSessionRequestTypeLicenseRelease,
+                               sb_drm_session_id, message);
+      break;
+    case wv3cdm::kIndividualizationRequest:
+      // Not used, onDirectIndividualizationRequest() will be called instead.
+      SB_NOTREACHED();
+      break;
+    case wv3cdm::kLicenseSub:
+      // For loading sub licenses from embedded key data, not used.
+      SB_NOTREACHED();
+      break;
+  }
+}
+
+void DrmSystemWidevine::onKeyStatusesChange(
+    const std::string& wvcdm_session_id) {
+#if SB_HAS(DRM_KEY_STATUSES)
+  wv3cdm::KeyStatusMap key_statuses;
+  wv3cdm::Status status = cdm_->getKeyStatuses(wvcdm_session_id, &key_statuses);
+
+  if (status != wv3cdm::kSuccess) {
+    return;
+  }
+
+  std::vector<SbDrmKeyId> sb_key_ids;
+  std::vector<SbDrmKeyStatus> sb_key_statuses;
+
+  for (auto& key_status : key_statuses) {
+    SbDrmKeyId sb_key_id;
+    SB_DCHECK(key_status.first.size() <= sizeof(sb_key_id.identifier));
+    SbMemoryCopy(sb_key_id.identifier, key_status.first.c_str(),
+                 key_status.first.size());
+    sb_key_id.identifier_size = static_cast<int>(key_status.first.size());
+    sb_key_ids.push_back(sb_key_id);
+    sb_key_statuses.push_back(CdmKeyStatusToSbDrmKeyStatus(key_status.second));
+  }
+
+  const std::string sb_drm_session_id =
+      WvdmSessionIdToSbDrmSessionId(wvcdm_session_id);
+  key_statuses_changed_callback_(this, context_, sb_drm_session_id.c_str(),
+                                 sb_drm_session_id.size(), sb_key_ids.size(),
+                                 sb_key_ids.data(), sb_key_statuses.data());
+#else   // SB_HAS(DRM_KEY_STATUSES)
+  SB_UNREFERENCED_PARAMETER(wvcdm_session_id);
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+}
+
+void DrmSystemWidevine::onRemoveComplete(const std::string& wvcdm_session_id) {
+  SB_UNREFERENCED_PARAMETER(wvcdm_session_id);
+  SB_NOTIMPLEMENTED();
+}
+
+void DrmSystemWidevine::onDeferredComplete(const std::string& wvcdm_session_id,
+                                           wv3cdm::Status result) {
+  SB_UNREFERENCED_PARAMETER(wvcdm_session_id);
+  SB_UNREFERENCED_PARAMETER(result);
+  SB_NOTIMPLEMENTED();
+}
+
+void DrmSystemWidevine::onDirectIndividualizationRequest(
+    const std::string& wvcdm_session_id,
+    const std::string& request) {
+  SendSessionUpdateRequest(kSbDrmSessionRequestTypeIndividualizationRequest,
+                           WvdmSessionIdToSbDrmSessionId(wvcdm_session_id),
+                           request);
+}
+
+void DrmSystemWidevine::SetTicket(const std::string& sb_drm_session_id,
+                                  int ticket) {
+  SB_DCHECK(SbThreadGetId() == ticket_thread_id_)
+      << "Ticket should only be set from the constructor thread.";
+  sb_drm_session_id_to_ticket_map_[sb_drm_session_id] = ticket;
+}
+
+int DrmSystemWidevine::GetAndResetTicket(const std::string& sb_drm_session_id) {
+  // Returning no ticket is a valid way to indicate that a host's method was
+  // called spontaneously by CDM, potentially from the timer thread.
+  if (SbThreadGetId() != ticket_thread_id_) {
+    return kSbDrmTicketInvalid;
+  }
+  auto iter = sb_drm_session_id_to_ticket_map_.find(sb_drm_session_id);
+  if (iter == sb_drm_session_id_to_ticket_map_.end()) {
+    return kSbDrmTicketInvalid;
+  }
+  auto ticket = iter->second;
+  sb_drm_session_id_to_ticket_map_.erase(iter);
+  return ticket;
+}
+
+std::string DrmSystemWidevine::WvdmSessionIdToSbDrmSessionId(
+    const std::string& wvcdm_session_id) {
+#if SB_API_VERSION >= 10
+  SB_DCHECK(wvcdm_session_id != kFirstSbDrmSessionId);
+  if (wvcdm_session_id == first_wvcdm_session_id_) {
+    return kFirstSbDrmSessionId;
+  }
+#endif  // SB_API_VERSION >= 10
+  return wvcdm_session_id;
+}
+
+std::string DrmSystemWidevine::SbDrmSessionIdToWvdmSessionId(
+    const void* sb_drm_session_id,
+    int sb_drm_session_id_size) {
+  const std::string str_sb_drm_session_id(
+      static_cast<const char*>(sb_drm_session_id), sb_drm_session_id_size);
+#if SB_API_VERSION >= 10
+  if (str_sb_drm_session_id == kFirstSbDrmSessionId) {
+    SB_DCHECK(!first_wvcdm_session_id_.empty());
+    return first_wvcdm_session_id_;
+  }
+#endif  // SB_API_VERSION >= 10
+  return str_sb_drm_session_id;
+}
+
+void DrmSystemWidevine::SendServerCertificateRequest(int ticket) {
+  std::string message;
+  auto status = cdm_->getServiceCertificateRequest(&message);
+  if (status == wv3cdm::kSuccess) {
+    SetTicket(kFirstSbDrmSessionId, ticket);
+    // Note that calling createSession() without a server certificate may fail.
+    // So use |kFirstSbDrmSessionId| as the session id.  Once we have a real
+    // session id, we will map it from/to the fake session id.
+    SendSessionUpdateRequest(kSbDrmSessionRequestTypeLicenseRequest,
+                             kFirstSbDrmSessionId, message);
+  } else {
+// Signals failure by sending NULL as the session id.
+#if SB_API_VERSION >= 10
+    session_update_request_callback_(
+        this, context_, ticket, CdmStatusToSbDrmStatus(status),
+        kSbDrmSessionRequestTypeLicenseRequest, "", NULL, 0, NULL, 0, NULL);
+#else   // SB_API_VERSION >= 10
+    session_update_request_callback_(this, context_, ticket, NULL, 0, NULL, 0,
+                                     NULL);
+#endif  // SB_API_VERSION >= 10
+  }
+}
+
+wv3cdm::Status DrmSystemWidevine::ProcessServerCertificateResponse(
+    const std::string& response) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  is_server_certificate_set_ = false;
+  std::string certificate;
+  auto status = cdm_->parseServiceCertificateResponse(response, &certificate);
+  if (status != wv3cdm::kSuccess) {
+    return status;
+  }
+  status = cdm_->setServiceCertificate(certificate);
+  is_server_certificate_set_ = (status == wv3cdm::kSuccess);
+  return status;
+}
+
+void DrmSystemWidevine::TrySendPendingGenerateSessionUpdateRequests() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  if (!is_server_certificate_set_) {
+    return;
+  }
+  decltype(pending_generate_session_update_requests_) pending_requests;
+  pending_requests.swap(pending_generate_session_update_requests_);
+  for (auto iter = pending_requests.begin(); iter != pending_requests.end();
+       ++iter) {
+    GenerateSessionUpdateRequestInternal(iter->ticket, iter->init_data_type,
+                                         iter->initialization_data,
+                                         iter == pending_requests.begin());
+  }
+}
+
+void DrmSystemWidevine::SendSessionUpdateRequest(
+    SbDrmSessionRequestType type,
+    const std::string& sb_drm_session_id,
+    const std::string& message) {
+  int ticket = GetAndResetTicket(sb_drm_session_id);
+
+#if SB_API_VERSION >= 10
+  session_update_request_callback_(
+      this, context_, ticket, kSbDrmStatusSuccess, type, "",
+      sb_drm_session_id.c_str(), static_cast<int>(sb_drm_session_id.size()),
+      message.c_str(), static_cast<int>(message.size()), NULL);
+#else   // SB_API_VERSION >= 10
+  session_update_request_callback_(
+      this, context_, ticket, sb_drm_session_id.c_str(),
+      static_cast<int>(sb_drm_session_id.size()), message.c_str(),
+      static_cast<int>(message.size()), NULL);
+#endif  // SB_API_VERSION >= 10
+}
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
diff --git a/src/starboard/shared/widevine/drm_system_widevine.h b/src/starboard/shared/widevine/drm_system_widevine.h
new file mode 100644
index 0000000..0d8509b
--- /dev/null
+++ b/src/starboard/shared/widevine/drm_system_widevine.h
@@ -0,0 +1,207 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIDEVINE_DRM_SYSTEM_WIDEVINE_H_
+#define STARBOARD_SHARED_WIDEVINE_DRM_SYSTEM_WIDEVINE_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/shared/starboard/drm/drm_system_internal.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/thread.h"
+#include "third_party/ce_cdm/cdm/include/cdm.h"
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+
+// Adapts Widevine's |Content Decryption Module v 3.5| to Starboard's
+// |SbDrmSystem|.
+//
+// All |SbDrmSystemPrivate| methods except Decrypt() must be called from the
+// constructor thread.
+class DrmSystemWidevine : public SbDrmSystemPrivate,
+                          private ::widevine::Cdm::IEventListener {
+ public:
+  DrmSystemWidevine(
+      void* context,
+      SbDrmSessionUpdateRequestFunc update_request_callback,
+      SbDrmSessionUpdatedFunc session_updated_callback
+#if SB_HAS(DRM_KEY_STATUSES)
+      ,
+      SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+      ,
+      SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+      ,
+      SbDrmSessionClosedFunc session_closed_callback
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+      ,
+      const std::string& company_name,
+      const std::string& model_name);
+
+  ~DrmSystemWidevine() override;
+
+  static bool IsKeySystemSupported(const char* key_system);
+
+  // From |SbDrmSystemPrivate|.
+  void GenerateSessionUpdateRequest(int ticket,
+                                    const char* type,
+                                    const void* initialization_data,
+                                    int initialization_data_size) override;
+
+  void UpdateSession(int ticket,
+                     const void* key,
+                     int key_size,
+                     const void* sb_drm_session_id,
+                     int sb_drm_session_id_size) override;
+
+  void CloseSession(const void* sb_drm_session_id,
+                    int sb_drm_session_id_size) override;
+
+  DecryptStatus Decrypt(InputBuffer* buffer) override;
+
+#if SB_API_VERSION >= 10
+  // This function is called by the app to explicitly set the server
+  // certificate.  For an app that supports this feature, it should call this
+  // function before calling any other functions like
+  // GenerateSessionUpdateRequest().  So we needn't process pending requests in
+  // this function.  Note that it is benign if this function is called in
+  // parallel with a server certificate request.
+  void UpdateServerCertificate(int ticket,
+                               const void* certificate,
+                               int certificate_size) override;
+#endif  // SB_API_VERSION >= 10
+
+ private:
+  // Stores the data necessary to call GenerateSessionUpdateRequestInternal().
+  struct GenerateSessionUpdateRequestData {
+    int ticket;
+    ::widevine::Cdm::InitDataType init_data_type;
+    std::string initialization_data;
+  };
+
+  // An unique id to identify the first SbDrm session id when server
+  // certificate is not ready.  This is necessary to send the server
+  // certificate request, as EME requires a session id while wvcdm cannot
+  // generate a session id before having a server certificate.
+  // This works with |first_wvcdm_session_id_| to map the first session id
+  // between wvcdm and SbDrm.
+  static const char kFirstSbDrmSessionId[];
+
+  void GenerateSessionUpdateRequestInternal(
+      int ticket,
+      ::widevine::Cdm::InitDataType init_data_type,
+      const std::string& initialization_data,
+      bool is_first_session);
+
+  // From |cdm::IEventListener|.
+  // A message (license request, renewal, etc.) to be dispatched to the
+  // application's license server. The response, if successful, should be
+  // provided back to the CDM via a call to Cdm::update().
+  void onMessage(const std::string& session_id,
+                 ::widevine::Cdm::MessageType message_type,
+                 const std::string& message) override;
+  // There has been a change in the keys in the session or their status.
+  void onKeyStatusesChange(const std::string& wvcdm_session_id) override;
+  // A remove() operation has been completed.
+  void onRemoveComplete(const std::string& wvcdm_session_id) override;
+  // Called when a deferred action has completed.
+  void onDeferredComplete(const std::string& wvcdm_session_id,
+                          ::widevine::Cdm::Status result) override;
+  // Called when the CDM requires a new device certificate.
+  void onDirectIndividualizationRequest(const std::string& wvcdm_session_id,
+                                        const std::string& request) override;
+
+  void SetTicket(const std::string& sb_drm_session_id, int ticket);
+  int GetAndResetTicket(const std::string& sb_drm_session_id);
+  std::string WvdmSessionIdToSbDrmSessionId(
+      const std::string& wvcdm_session_id);
+  std::string SbDrmSessionIdToWvdmSessionId(const void* sb_drm_session_id,
+                                            int sb_drm_session_id_size);
+
+  // Generates a special key message to ask for the server certificate.  When
+  // the license server receives the request, it will send back the server
+  // certificate.
+  void SendServerCertificateRequest(int ticket);
+  // When this function is called, the update contains the server certificate.
+  // The function parses the special update and pass the server certificate to
+  // the cdm.
+  // Note that the app shouldn't persist the server certificate across playback
+  // or across application instances.
+  ::widevine::Cdm::Status ProcessServerCertificateResponse(
+      const std::string& response);
+  // If server certificate has been set, send all pending requests.
+  void TrySendPendingGenerateSessionUpdateRequests();
+  void SendSessionUpdateRequest(SbDrmSessionRequestType type,
+                                const std::string& sb_drm_session_id,
+                                const std::string& message);
+
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+  void* const context_;
+  const SbDrmSessionUpdateRequestFunc session_update_request_callback_;
+  const SbDrmSessionUpdatedFunc session_updated_callback_;
+#if SB_HAS(DRM_KEY_STATUSES)
+  const SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback_;
+#endif  // SB_HAS(DRM_KEY_STATUSES)
+#if SB_API_VERSION >= 10
+  const SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback_;
+#endif  // SB_API_VERSION >= 10
+#if SB_HAS(DRM_SESSION_CLOSED)
+  const SbDrmSessionClosedFunc session_closed_callback_;
+#endif  // SB_HAS(DRM_SESSION_CLOSED)
+
+  // Store a map from session id generated by the cdm to its associated ticket
+  // id.  The ticket is a unique id passed to GenerateSessionUpdateRequest() to
+  // allow the caller of GenerateSessionUpdateRequest() to associate the
+  // session id with the session related data specified by the ticket, as both
+  // of them will be passed via session_update_request_callback_ when it is
+  // called for the first time for this paritcular session id.  As this is only
+  // necessary for the first time the callback is called on the particular
+  // session, every time an entry is used, it will be removed from the map.
+  // Note that the first callback is always accessed on the thread specificed
+  // by |ticket_thread_id_|.
+  std::map<std::string, int> sb_drm_session_id_to_ticket_map_;
+
+  // |ticket_| is only valid on the constructor thread within the duration of
+  // call to |GenerateKeyRequest| or |AddKey|, but CDM may invoke host's methods
+  // spontaneously from the timer thread. In that case |GetTicket| need to
+  // return |kSbDrmTicketInvalid|.
+  const SbThreadId ticket_thread_id_;
+
+  std::vector<GenerateSessionUpdateRequestData>
+      pending_generate_session_update_requests_;
+  std::string first_wvcdm_session_id_;
+
+  scoped_ptr<::widevine::Cdm> cdm_;
+#if SB_API_VERSION >= 10
+  bool is_server_certificate_set_ = false;
+#else   // SB_API_VERSION >= 10
+  bool is_server_certificate_set_ = true;
+#endif  // SB_API_VERSION >= 10
+
+  volatile bool quitting_ = false;
+};
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIDEVINE_DRM_SYSTEM_WIDEVINE_H_
diff --git a/src/starboard/shared/widevine/drm_update_server_certificate.cc b/src/starboard/shared/widevine/drm_update_server_certificate.cc
new file mode 100644
index 0000000..b9f29d4
--- /dev/null
+++ b/src/starboard/shared/widevine/drm_update_server_certificate.cc
@@ -0,0 +1,39 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/drm.h"
+
+#include "starboard/log.h"
+#include "starboard/shared/starboard/drm/drm_system_internal.h"
+
+#if SB_API_VERSION >= 10
+
+void SbDrmUpdateServerCertificate(SbDrmSystem drm_system,
+                                  int ticket,
+                                  const void* certificate,
+                                  int certificate_size) {
+  if (!SbDrmSystemIsValid(drm_system)) {
+    SB_DLOG(ERROR) << "Invalid DRM system.";
+    return;
+  }
+
+  if (ticket == kSbDrmTicketInvalid) {
+    SB_DLOG(ERROR) << "Ticket must be specified.";
+    return;
+  }
+
+  drm_system->UpdateServerCertificate(ticket, certificate, certificate_size);
+}
+
+#endif  // SB_API_VERSION >= 10
diff --git a/src/starboard/shared/widevine/media_is_supported.cc b/src/starboard/shared/widevine/media_is_supported.cc
new file mode 100644
index 0000000..f201c68
--- /dev/null
+++ b/src/starboard/shared/widevine/media_is_supported.cc
@@ -0,0 +1,27 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/media.h"
+#include "starboard/shared/widevine/drm_system_widevine.h"
+
+SB_EXPORT bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
+                                  SbMediaAudioCodec audio_codec,
+                                  const char* key_system) {
+  using starboard::shared::widevine::DrmSystemWidevine;
+
+  SB_UNREFERENCED_PARAMETER(video_codec);
+  SB_UNREFERENCED_PARAMETER(audio_codec);
+
+  return DrmSystemWidevine::IsKeySystemSupported(key_system);
+}
diff --git a/src/starboard/shared/widevine/widevine3.gyp b/src/starboard/shared/widevine/widevine3.gyp
new file mode 100644
index 0000000..77761ae
--- /dev/null
+++ b/src/starboard/shared/widevine/widevine3.gyp
@@ -0,0 +1,77 @@
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+  'includes': [
+    # sets defaults for variables expected by cdm.gyp.
+    '<(DEPTH)/third_party/ce_cdm/platforms/x86-64/settings.gypi',
+    # cdm.gyp defines widevine_ce_cdm_static.
+    '<(DEPTH)/third_party/ce_cdm/cdm/cdm.gyp',
+  ],
+  'variables': {
+    'oemcrypto_target': 'oemcrypto',
+
+    # Use the protoc supplied in src/tools as precompiled executable.
+    'protoc_dir': '<(DEPTH)/tools',
+    'protoc_bin': '<(DEPTH)/tools/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
+    'protoc': '<(DEPTH)/tools/protoc.exe',
+
+    # Use the chromium target for protobuf.
+    'protobuf_lib_type': 'target',
+    'protobuf_lib': '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
+
+    'platform_oem_sources': [
+      '<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform).h',
+      '<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform)_client.c',
+      '<(DEPTH)/starboard/shared/widevine/wv_keybox.cc',
+    ],
+   },
+  'target_defaults': {
+    'include_dirs': [
+      # Get protobuf headers from the chromium tree.
+      '<(DEPTH)/third_party/protobuf/src',
+    ],
+    'dependencies': [
+      '<(DEPTH)/third_party/openssl/openssl.gyp:openssl',
+      # Depend on the locally-built protoc.
+      #'<(DEPTH)/third_party/protobuf/protobuf.gyp:protoc#host',
+    ],
+  },
+  'targets': [
+    {
+      'target_name': 'oemcrypto',
+      'type': 'static_library',
+      'defines': [
+        'USE_BUILT_OPENSSL',
+        'COBALT_WIDEVINE_KEYBOX_TRANSFORM_FUNCTION=<(sb_widevine_platform)_client',
+        'COBALT_WIDEVINE_KEYBOX_TRANSFORM_INCLUDE="starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform).h"',
+        'COBALT_WIDEVINE_KEYBOX_INCLUDE="<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)_widevine_keybox.h"',
+      ],
+      'sources': [
+        '<@(platform_oem_sources)',
+      ],
+      'variables': {
+        'oec_mock_dir': '<(DEPTH)/third_party/ce_cdm/oemcrypto/mock',
+      },
+      'dependencies': [
+        '<(DEPTH)/third_party/ce_cdm/oemcrypto/mock/oec_mock.gyp:oec_mock',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          '<(DEPTH)/third_party/ce_cdm/core/include',
+          '<(DEPTH)/third_party/ce_cdm/oemcrypto/include',
+        ],
+      },
+    },
+  ],
+}
diff --git a/src/starboard/shared/widevine/widevine_storage.cc b/src/starboard/shared/widevine/widevine_storage.cc
new file mode 100644
index 0000000..7c3deca
--- /dev/null
+++ b/src/starboard/shared/widevine/widevine_storage.cc
@@ -0,0 +1,183 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/widevine/widevine_storage.h"
+
+#include "starboard/file.h"
+#include "starboard/log.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+
+namespace {
+
+void ReadFile(const std::string& path_name, std::vector<uint8_t>* content) {
+  SB_DCHECK(content);
+
+  ScopedFile file(path_name.c_str(), kSbFileOpenOnly | kSbFileRead);
+
+  if (!file.IsValid()) {
+    content->clear();
+    SB_LOG(INFO) << "Failed to open " << path_name
+                 << ", returning empty content.";
+    return;
+  }
+
+  auto size = file.GetSize();
+  if (size < 0) {
+    content->clear();
+    SB_LOG(INFO) << "Failed to get size of " << path_name
+                 << ", returning empty content.";
+    return;
+  }
+
+  content->resize(size);
+  if (file.ReadAll(reinterpret_cast<char*>(content->data()), size) != size) {
+    content->clear();
+    SB_LOG(INFO) << "Failed to read content of " << path_name
+                 << ", returning empty content.";
+    return;
+  }
+}
+
+bool WriteFile(const std::string& path_name,
+               const std::vector<uint8_t>& content) {
+  ScopedFile file(path_name.c_str(), kSbFileCreateAlways | kSbFileWrite);
+
+  if (!file.IsValid()) {
+    SB_LOG(INFO) << "Failed to create " << path_name << " for writing.";
+    return false;
+  }
+
+  if (file.WriteAll(reinterpret_cast<const char*>(content.data()),
+                    static_cast<int>(content.size())) != content.size()) {
+    SB_LOG(INFO) << "Failed to write content to " << path_name << '.';
+    return false;
+  }
+
+  file.Flush();
+
+  return true;
+}
+
+bool ReadString(const std::vector<uint8_t>& data,
+                size_t* offset,
+                std::string* str) {
+  if (*offset + sizeof(int) > data.size()) {
+    SB_LOG(ERROR) << "Failed to read the size of string from |data|.";
+    return false;
+  }
+  int size = *reinterpret_cast<const int*>(data.data() + *offset);
+  *offset += sizeof(int);
+  if (*offset + size > data.size()) {
+    SB_LOG(ERROR) << "Failed to read " << size << " bytes from |data|.";
+    return false;
+  }
+  str->assign(reinterpret_cast<const char*>(data.data() + *offset),
+              reinterpret_cast<const char*>(data.data() + *offset + size));
+  *offset += size;
+  return true;
+}
+
+void WriteString(const std::string& str, std::vector<uint8_t>* content) {
+  content->reserve(content->size() + sizeof(int) + str.size());
+  content->resize(content->size() + sizeof(int));
+  *reinterpret_cast<int*>(content->data() + content->size() - sizeof(int)) =
+      static_cast<int>(str.size());
+  content->insert(content->end(), reinterpret_cast<const uint8_t*>(str.c_str()),
+                  reinterpret_cast<const uint8_t*>(str.c_str()) + str.size());
+}
+
+}  // namespace
+
+WidevineStorage::WidevineStorage(const std::string& path_name)
+    : path_name_(path_name) {
+  std::vector<uint8_t> content;
+  ReadFile(path_name_, &content);
+  size_t offset = 0;
+
+  while (offset != content.size()) {
+    std::string name, value;
+    if (!ReadString(content, &offset, &name) ||
+        !ReadString(content, &offset, &value)) {
+      cache_.clear();
+      SB_LOG(WARNING) << path_name_ << " is corrupt, returns empty content.";
+      return;
+    }
+    cache_[name] = value;
+  }
+
+  SB_LOG(INFO) << "Loaded " << cache_.size() << " records from " << path_name_;
+}
+
+bool WidevineStorage::read(const std::string& name, std::string* data) {
+  SB_DCHECK(data);
+  ScopedLock scoped_lock(lock_);
+  auto iter = cache_.find(name);
+  if (iter == cache_.end()) {
+    return false;
+  }
+  *data = iter->second;
+  return true;
+}
+
+bool WidevineStorage::write(const std::string& name, const std::string& data) {
+  ScopedLock scoped_lock(lock_);
+  cache_[name] = data;
+
+  std::vector<uint8_t> content;
+  for (auto iter : cache_) {
+    WriteString(iter.first, &content);
+    WriteString(iter.second, &content);
+  }
+
+  return WriteFile(path_name_, content);
+}
+
+bool WidevineStorage::exists(const std::string& name) {
+  ScopedLock scoped_lock(lock_);
+  return cache_.find(name) != cache_.end();
+}
+
+bool WidevineStorage::remove(const std::string& name) {
+  ScopedLock scoped_lock(lock_);
+  auto iter = cache_.find(name);
+  if (iter == cache_.end()) {
+    return false;
+  }
+  cache_.erase(iter);
+  return true;
+}
+
+int32_t WidevineStorage::size(const std::string& name) {
+  ScopedLock scoped_lock(lock_);
+  auto iter = cache_.find(name);
+  return iter == cache_.end() ? -1 : static_cast<int32_t>(iter->second.size());
+}
+
+bool WidevineStorage::list(std::vector<std::string>* records) {
+  SB_DCHECK(records);
+  ScopedLock scoped_lock(lock_);
+  records->clear();
+  for (auto item : cache_) {
+    records->push_back(item.first);
+  }
+  return !records->empty();
+}
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
diff --git a/src/starboard/shared/widevine/widevine_storage.h b/src/starboard/shared/widevine/widevine_storage.h
new file mode 100644
index 0000000..ad40bd7
--- /dev/null
+++ b/src/starboard/shared/widevine/widevine_storage.h
@@ -0,0 +1,56 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIDEVINE_WIDEVINE_STORAGE_H_
+#define STARBOARD_SHARED_WIDEVINE_WIDEVINE_STORAGE_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "starboard/mutex.h"
+#include "third_party/ce_cdm/cdm/include/cdm.h"
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+
+// Manages the load and save of name/value pairs in std::string.  It is used by
+// Widevine to store persistent data like device provisioning.
+class WidevineStorage : public ::widevine::Cdm::IStorage {
+ public:
+  explicit WidevineStorage(const std::string& path_name);
+
+  bool read(const std::string& name, std::string* data) override;
+  bool write(const std::string& name, const std::string& data) override;
+  bool exists(const std::string& name) override;
+  bool remove(const std::string& name) override;
+  int32_t size(const std::string& name) override;
+
+  // Populates |file_names| with the name of each file in the file system.
+  // This is assumed to be a flat filename space (top level directory is
+  // unnamed, and there are no subdirectories).
+  bool list(std::vector<std::string>* records) override;
+
+ private:
+  Mutex lock_;
+  std::string path_name_;
+  std::map<std::string, std::string> cache_;
+};
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIDEVINE_WIDEVINE_STORAGE_H_
diff --git a/src/starboard/shared/widevine/widevine_timer.cc b/src/starboard/shared/widevine/widevine_timer.cc
new file mode 100644
index 0000000..141fe08
--- /dev/null
+++ b/src/starboard/shared/widevine/widevine_timer.cc
@@ -0,0 +1,130 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/widevine/widevine_timer.h"
+
+#include "starboard/time.h"
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+
+namespace {
+
+struct ThreadParam {
+  WidevineTimer* timer;
+  ConditionVariable* condition_variable;
+};
+
+}  // namespace
+
+WidevineTimer::~WidevineTimer() {
+  for (auto iter : active_clients_) {
+    delete iter.second;
+  }
+}
+
+void WidevineTimer::setTimeout(int64_t delay_in_milliseconds,
+                               IClient* client,
+                               void* context) {
+  ScopedLock scoped_lock(mutex_);
+  if (active_clients_.empty()) {
+    SB_DCHECK(!SbThreadIsValid(thread_));
+    SB_DCHECK(!job_queue_);
+
+    ConditionVariable condition_variable(mutex_);
+    ThreadParam thread_param = {this, &condition_variable};
+    thread_ =
+        SbThreadCreate(0, kSbThreadNoPriority, kSbThreadNoAffinity, true,
+                       "wv_timer", &WidevineTimer::ThreadFunc, &thread_param);
+    condition_variable.Wait();
+  }
+
+  SB_DCHECK(SbThreadIsValid(thread_));
+  SB_DCHECK(job_queue_);
+
+  auto iter = active_clients_.find(client);
+  if (iter == active_clients_.end()) {
+    iter = active_clients_.emplace(client, new JobQueue::JobOwner(job_queue_))
+               .first;
+  }
+
+  iter->second->Schedule([=]() { client->onTimerExpired(context); },
+                         delay_in_milliseconds * kSbTimeMillisecond);
+}
+
+void WidevineTimer::cancel(IClient* client) {
+  ScopedLock scoped_lock(mutex_);
+  auto iter = active_clients_.find(client);
+  if (iter == active_clients_.end()) {
+    // cancel() can be called before any timer is scheduled.
+    return;
+  }
+
+  SB_DCHECK(job_queue_);
+
+  ConditionVariable condition_variable(mutex_);
+  job_queue_->Schedule(
+      [&]() { CancelAllJobsOnClient(client, &condition_variable); });
+  condition_variable.Wait();
+
+  if (active_clients_.empty()) {
+    // Kill the thread on the last |client|.
+    job_queue_->StopSoon();
+    SbThreadJoin(thread_, NULL);
+    thread_ = kSbThreadInvalid;
+    job_queue_ = NULL;
+  }
+}
+
+// static
+void* WidevineTimer::ThreadFunc(void* param) {
+  SB_DCHECK(param);
+  ThreadParam* thread_param = static_cast<ThreadParam*>(param);
+  thread_param->timer->RunLoop(thread_param->condition_variable);
+  return NULL;
+}
+
+void WidevineTimer::RunLoop(ConditionVariable* condition_variable) {
+  SB_DCHECK(!job_queue_);
+  SB_DCHECK(condition_variable);
+
+  JobQueue job_queue;
+
+  {
+    ScopedLock scoped_lock(mutex_);
+    job_queue_ = &job_queue;
+    condition_variable->Signal();
+  }
+
+  job_queue.RunUntilStopped();
+}
+
+void WidevineTimer::CancelAllJobsOnClient(
+    IClient* client,
+    ConditionVariable* condition_variable) {
+  SB_DCHECK(condition_variable);
+  SB_DCHECK(job_queue_->BelongsToCurrentThread());
+
+  ScopedLock scoped_lock(mutex_);
+  auto iter = active_clients_.find(client);
+  iter->second->CancelPendingJobs();
+  delete iter->second;
+  active_clients_.erase(iter);
+  condition_variable->Signal();
+}
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
diff --git a/src/starboard/shared/widevine/widevine_timer.h b/src/starboard/shared/widevine/widevine_timer.h
new file mode 100644
index 0000000..58cebe8
--- /dev/null
+++ b/src/starboard/shared/widevine/widevine_timer.h
@@ -0,0 +1,63 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIDEVINE_WIDEVINE_TIMER_H_
+#define STARBOARD_SHARED_WIDEVINE_WIDEVINE_TIMER_H_
+
+#include <map>
+
+#include "starboard/condition_variable.h"
+#include "starboard/mutex.h"
+#include "starboard/shared/starboard/player/job_queue.h"
+#include "starboard/thread.h"
+#include "third_party/ce_cdm/cdm/include/cdm.h"
+
+namespace starboard {
+namespace shared {
+namespace widevine {
+
+// Manages the scheduled callbacks of Widevine.  All its public functions can
+// be called from any threads.
+class WidevineTimer : public ::widevine::Cdm::ITimer {
+ public:
+  ~WidevineTimer() override;
+
+  // Call |client->onTimerExpired(context)| after |delay_in_milliseconds|.
+  void setTimeout(int64_t delay_in_milliseconds,
+                  IClient* client,
+                  void* context) override;
+
+  // Cancel all timers associated with |client|.  No timer should be called on
+  // the specific client after this function returns.
+  void cancel(IClient* client) override;
+
+ private:
+  typedef starboard::player::JobQueue JobQueue;
+
+  static void* ThreadFunc(void* param);
+  void RunLoop(ConditionVariable* condition_variable);
+  void CancelAllJobsOnClient(IClient* client,
+                             ConditionVariable* condition_variable);
+
+  Mutex mutex_;
+  SbThread thread_ = kSbThreadInvalid;
+  JobQueue* job_queue_ = NULL;
+  std::map<IClient*, JobQueue::JobOwner*> active_clients_;
+};
+
+}  // namespace widevine
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIDEVINE_WIDEVINE_TIMER_H_
diff --git a/src/third_party/angle/src/common/debug.cpp b/src/third_party/angle/src/common/debug.cpp
index 597e9d6..1c7e2c8 100644
--- a/src/third_party/angle/src/common/debug.cpp
+++ b/src/third_party/angle/src/common/debug.cpp
@@ -19,6 +19,10 @@
 #include "common/angleutils.h"
 #include "common/Optional.h"
 
+#if defined(STARBOARD)
+#include "starboard/log.h"
+#endif  // defined(STARBOARD)
+
 namespace gl
 {
 
@@ -138,6 +142,16 @@
 
 void Trace(LogSeverity severity, const char *message)
 {
+#if defined(STARBOARD)
+    if (severity == LOG_WARN)
+    {
+        SB_LOG(WARNING) << "Angle: " << message;
+    }
+    else if (severity == LOG_ERR)
+    {
+        SB_LOG(ERROR) << "Angle: " << message;
+    }
+#endif  // defined(STARBOARD)
     if (!ShouldCreateLogMessage(severity))
     {
         return;
diff --git a/src/third_party/libxml/src/tree.c b/src/third_party/libxml/src/tree.c
index 00e1b4e..f34fe1e 100644
--- a/src/third_party/libxml/src/tree.c
+++ b/src/third_party/libxml/src/tree.c
@@ -1686,7 +1686,7 @@
             if (inLine) {
                 ret = xmlStrcat(ret, node->content);
             } else {
-                xmlChar *buffer;
+                xmlChar *buffer = NULL;
 
 		if (attr) {
 #ifdef LIBXML_OUTPUT_ENABLED
diff --git a/src/third_party/skia/src/sksl/SkSLCPPCodeGenerator.cpp b/src/third_party/skia/src/sksl/SkSLCPPCodeGenerator.cpp
index 235c9d8..021bdb6 100644
--- a/src/third_party/skia/src/sksl/SkSLCPPCodeGenerator.cpp
+++ b/src/third_party/skia/src/sksl/SkSLCPPCodeGenerator.cpp
@@ -39,6 +39,7 @@
         vsprintf(heap.get(), s, copy);
         fOut->write(heap.get(), length);
     }
+    va_end(copy);
 }
 
 void CPPCodeGenerator::writef(const char* s, ...) {
diff --git a/src/third_party/skia/src/sksl/SkSLString.cpp b/src/third_party/skia/src/sksl/SkSLString.cpp
index fb8fd56..18ab25e 100644
--- a/src/third_party/skia/src/sksl/SkSLString.cpp
+++ b/src/third_party/skia/src/sksl/SkSLString.cpp
@@ -21,6 +21,7 @@
     va_start(args, fmt);
     String result;
     result.vappendf(fmt, args);
+    va_end(args);
     return result;
 }
 
@@ -29,6 +30,7 @@
     va_list args;
     va_start(args, fmt);
     this->vappendf(fmt, args);
+    va_end(args);
 }
 #endif
 
@@ -50,6 +52,7 @@
         VSNPRINTF(newBuffer.get(), size + 1, fmt, reuse);
         this->append(newBuffer.get(), size);
     }
+    va_end(reuse);
 }
 
 
diff --git a/src/third_party/skia/src/sksl/ir/SkSLLayout.h b/src/third_party/skia/src/sksl/ir/SkSLLayout.h
index 8bf0472..f2c66b6 100644
--- a/src/third_party/skia/src/sksl/ir/SkSLLayout.h
+++ b/src/third_party/skia/src/sksl/ir/SkSLLayout.h
@@ -165,7 +165,7 @@
             separator = ", ";
         }
         if (fInputAttachmentIndex >= 0) {
-            result += separator + "input_attachment_index = " + to_string(fBuiltin);
+            result += separator + "input_attachment_index = " + to_string(fInputAttachmentIndex);
             separator = ", ";
         }
         if (fOriginUpperLeft) {
