Backed out changeset 9022f5fdcf98 (bug 483446) for mochitest-5 orange.
authorRyan VanderMeulen <ryanvm@gmail.com>
Tue, 16 Jul 2013 10:45:35 -0400
changeset 138685 12deadfb628eb712668e141a83781c0334840341
parent 138684 d5d03b2c7fabdf6c399b7695c8925a91cea12689
child 138686 9593e9c0415aa542c49e634a80286010605fdca7
push id24964
push userryanvm@gmail.com
push dateTue, 16 Jul 2013 20:04:09 +0000
treeherderautoland@fd10ead17ace [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs483446
milestone25.0a1
backs out9022f5fdcf98c520059892f1cfca3f022bdc2a10
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 9022f5fdcf98 (bug 483446) for mochitest-5 orange.
layout/base/nsCSSRendering.cpp
layout/base/nsStyleConsts.h
layout/generic/nsGfxScrollFrame.h
layout/generic/nsIScrollableFrame.h
layout/reftests/backgrounds/attachment-local-clipping-color-1-ref.html
layout/reftests/backgrounds/attachment-local-clipping-color-1.html
layout/reftests/backgrounds/attachment-local-clipping-color-2.html
layout/reftests/backgrounds/attachment-local-clipping-color-3-ref.html
layout/reftests/backgrounds/attachment-local-clipping-color-3.html
layout/reftests/backgrounds/attachment-local-clipping-color-4-ref.html
layout/reftests/backgrounds/attachment-local-clipping-color-4.html
layout/reftests/backgrounds/attachment-local-clipping-color-5.html
layout/reftests/backgrounds/attachment-local-clipping-color-6-ref.html
layout/reftests/backgrounds/attachment-local-clipping-color-6.html
layout/reftests/backgrounds/attachment-local-clipping-image-1-ref.html
layout/reftests/backgrounds/attachment-local-clipping-image-1.html
layout/reftests/backgrounds/attachment-local-clipping-image-2.html
layout/reftests/backgrounds/attachment-local-clipping-image-3-ref.html
layout/reftests/backgrounds/attachment-local-clipping-image-3.html
layout/reftests/backgrounds/attachment-local-clipping-image-4-ref.html
layout/reftests/backgrounds/attachment-local-clipping-image-4.html
layout/reftests/backgrounds/attachment-local-clipping-image-5.html
layout/reftests/backgrounds/attachment-local-clipping-image-6-ref.html
layout/reftests/backgrounds/attachment-local-clipping-image-6.html
layout/reftests/backgrounds/attachment-local-positioning-1-ref.html
layout/reftests/backgrounds/attachment-local-positioning-1.html
layout/reftests/backgrounds/attachment-local-positioning-2-ref.html
layout/reftests/backgrounds/attachment-local-positioning-2.html
layout/reftests/backgrounds/attachment-local-positioning-3-ref.html
layout/reftests/backgrounds/attachment-local-positioning-3.html
layout/reftests/backgrounds/attachment-local-positioning-4-ref.html
layout/reftests/backgrounds/attachment-local-positioning-4.html
layout/reftests/backgrounds/attachment-local-positioning-5-ref.html
layout/reftests/backgrounds/attachment-local-positioning-5.html
layout/reftests/backgrounds/attachment-scroll-positioning-1-ref.html
layout/reftests/backgrounds/attachment-scroll-positioning-1.html
layout/reftests/backgrounds/reftest.list
layout/style/nsCSSKeywordList.h
layout/style/nsCSSProps.cpp
layout/style/test/property_database.js
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -1671,75 +1671,39 @@ SetupDirtyRects(const nsRect& aBGClipAre
   *aDirtyRectGfx = nsLayoutUtils::RectToGfxRect(*aDirtyRect, aAppUnitsPerPixel);
   NS_WARN_IF_FALSE(aDirtyRect->IsEmpty() || !aDirtyRectGfx->IsEmpty(),
                    "converted dirty rect should not be empty");
   NS_ABORT_IF_FALSE(!aDirtyRect->IsEmpty() || aDirtyRectGfx->IsEmpty(),
                     "second should be empty if first is");
 }
 
 struct BackgroundClipState {
-  nsRect mBGClipArea;  // Affected by mClippedRadii
-  nsRect mAdditionalBGClipArea;  // Not affected by mClippedRadii
+  nsRect mBGClipArea;
   nsRect mDirtyRect;
   gfxRect mDirtyRectGfx;
 
   gfxCornerSizes mClippedRadii;
   bool mRadiiAreOuter;
-  bool mHasAdditionalBGClipArea;
 
   // Whether we are being asked to draw with a caller provided background
   // clipping area. If this is true we also disable rounded corners.
   bool mCustomClip;
 };
 
 static void
 GetBackgroundClip(gfxContext *aCtx, uint8_t aBackgroundClip,
-                  uint8_t aBackgroundAttachment,
                   nsIFrame* aForFrame, const nsRect& aBorderArea,
                   const nsRect& aCallerDirtyRect, bool aHaveRoundedCorners,
                   const gfxCornerSizes& aBGRadii, nscoord aAppUnitsPerPixel,
                   /* out */ BackgroundClipState* aClipState)
 {
   aClipState->mBGClipArea = aBorderArea;
-  aClipState->mHasAdditionalBGClipArea = false;
   aClipState->mCustomClip = false;
   aClipState->mRadiiAreOuter = true;
   aClipState->mClippedRadii = aBGRadii;
-  if (aForFrame->GetType() == nsGkAtoms::scrollFrame &&
-        NS_STYLE_BG_ATTACHMENT_LOCAL == aBackgroundAttachment) {
-    // As of this writing, this is still in discussion in the CSS Working Group
-    // http://lists.w3.org/Archives/Public/www-style/2013Jul/0250.html
-
-    // The rectangle for 'background-clip' scrolls with the content,
-    // but the background is also clipped at a non-scrolling 'padding-box'
-    // like the content. (See below.)
-    // Therefore, only 'content-box' makes a difference here.
-    if (aBackgroundClip == NS_STYLE_BG_CLIP_CONTENT) {
-      nsIScrollableFrame* scrollableFrame = do_QueryFrame(aForFrame);
-      // Clip at a rectangle attached to the scrolled content.
-      aClipState->mHasAdditionalBGClipArea = true;
-      aClipState->mAdditionalBGClipArea = nsRect(
-        aClipState->mBGClipArea.TopLeft()
-          + scrollableFrame->GetScrolledFrame()->GetPosition()
-          // For the dir=rtl case:
-          + scrollableFrame->GetScrollRange().TopLeft(),
-        scrollableFrame->GetScrolledRect().Size());
-      nsMargin padding = aForFrame->GetUsedPadding();
-      // padding-bottom is ignored on scrollable frames:
-      // https://bugzilla.mozilla.org/show_bug.cgi?id=748518
-      padding.bottom = 0;
-      aForFrame->ApplySkipSides(padding);
-      aClipState->mAdditionalBGClipArea.Deflate(padding);
-    }
-
-    // Also clip at a non-scrolling, rounded-corner 'padding-box',
-    // same as the scrolled content because of the 'overflow' property.
-    aBackgroundClip = NS_STYLE_BG_CLIP_PADDING;
-  }
-
   if (aBackgroundClip != NS_STYLE_BG_CLIP_BORDER) {
     nsMargin border = aForFrame->GetUsedBorder();
     if (aBackgroundClip == NS_STYLE_BG_CLIP_MOZ_ALMOST_PADDING) {
       // Reduce |border| by 1px (device pixels) on all sides, if
       // possible, so that we don't get antialiasing seams between the
       // background and border.
       border.top = std::max(0, border.top - aAppUnitsPerPixel);
       border.right = std::max(0, border.right - aAppUnitsPerPixel);
@@ -1761,23 +1725,16 @@ GetBackgroundClip(gfxContext *aCtx, uint
         gfxFloat(border.left / aAppUnitsPerPixel)
       };
       nsCSSBorderRenderer::ComputeInnerRadii(aBGRadii, borderSizes,
                                              &aClipState->mClippedRadii);
       aClipState->mRadiiAreOuter = false;
     }
   }
 
-  if (!aHaveRoundedCorners && aClipState->mHasAdditionalBGClipArea) {
-    // Do the intersection here to account for the fast path(?) below.
-    aClipState->mBGClipArea =
-      aClipState->mBGClipArea.Intersect(aClipState->mAdditionalBGClipArea);
-    aClipState->mHasAdditionalBGClipArea = false;
-  }
-
   SetupDirtyRects(aClipState->mBGClipArea, aCallerDirtyRect, aAppUnitsPerPixel,
                   &aClipState->mDirtyRect, &aClipState->mDirtyRectGfx);
 }
 
 static void
 SetupBackgroundClip(BackgroundClipState& aClipState, gfxContext *aCtx,
                     bool aHaveRoundedCorners, nscoord aAppUnitsPerPixel,
                     gfxContextAutoSaveRestore* aAutoSR)
@@ -1796,45 +1753,32 @@ SetupBackgroundClip(BackgroundClipState&
 
   // If we have rounded corners, clip all subsequent drawing to the
   // rounded rectangle defined by bgArea and bgRadii (we don't know
   // whether the rounded corners intrude on the dirtyRect or not).
   // Do not do this if we have a caller-provided clip rect --
   // as above with bgArea, arguably a bug, but table painting seems
   // to depend on it.
 
-  if (aHaveRoundedCorners || aClipState.mHasAdditionalBGClipArea) {
-    aAutoSR->Reset(aCtx);
-  }
-
-  if (aClipState.mHasAdditionalBGClipArea) {
-    gfxRect bgAreaGfx = nsLayoutUtils::RectToGfxRect(
-      aClipState.mAdditionalBGClipArea, aAppUnitsPerPixel);
-    bgAreaGfx.Round();
-    bgAreaGfx.Condition();
-    aCtx->NewPath();
-    aCtx->Rectangle(bgAreaGfx, true);
-    aCtx->Clip();
-  }
-
   if (aHaveRoundedCorners) {
     gfxRect bgAreaGfx =
       nsLayoutUtils::RectToGfxRect(aClipState.mBGClipArea, aAppUnitsPerPixel);
     bgAreaGfx.Round();
     bgAreaGfx.Condition();
 
     if (bgAreaGfx.IsEmpty()) {
       // I think it's become possible to hit this since
       // http://hg.mozilla.org/mozilla-central/rev/50e934e4979b landed.
       NS_WARNING("converted background area should not be empty");
       // Make our caller not do anything.
       aClipState.mDirtyRectGfx.SizeTo(gfxSize(0.0, 0.0));
       return;
     }
 
+    aAutoSR->Reset(aCtx);
     aCtx->NewPath();
     aCtx->RoundedRectangle(bgAreaGfx, aClipState.mClippedRadii, aClipState.mRadiiAreOuter);
     aCtx->Clip();
   }
 }
 
 static void
 DrawBackgroundColor(BackgroundClipState& aClipState, gfxContext *aCtx,
@@ -1871,30 +1815,19 @@ DrawBackgroundColor(BackgroundClipState&
 
   aCtx->Save();
   gfxRect dirty = bgAreaGfx.Intersect(aClipState.mDirtyRectGfx);
 
   aCtx->NewPath();
   aCtx->Rectangle(dirty, true);
   aCtx->Clip();
 
-  if (aClipState.mHasAdditionalBGClipArea) {
-    gfxRect bgAdditionalAreaGfx = nsLayoutUtils::RectToGfxRect(
-      aClipState.mAdditionalBGClipArea, aAppUnitsPerPixel);
-    bgAdditionalAreaGfx.Round();
-    bgAdditionalAreaGfx.Condition();
-    aCtx->NewPath();
-    aCtx->Rectangle(bgAdditionalAreaGfx, true);
-    aCtx->Clip();
-  }
-
   aCtx->NewPath();
   aCtx->RoundedRectangle(bgAreaGfx, aClipState.mClippedRadii,
                          aClipState.mRadiiAreOuter);
-
   aCtx->Fill();
   aCtx->Restore();
 }
 
 nscolor
 nsCSSRendering::DetermineBackgroundColor(nsPresContext* aPresContext,
                                          nsStyleContext* aStyleContext,
                                          nsIFrame* aFrame,
@@ -2645,18 +2578,17 @@ nsCSSRendering::PaintBackgroundWithSC(ns
     if (isSolidBorder && currentBackgroundClip == NS_STYLE_BG_CLIP_BORDER) {
       // If we have rounded corners, we need to inflate the background
       // drawing area a bit to avoid seams between the border and
       // background.
       currentBackgroundClip = haveRoundedCorners ?
         NS_STYLE_BG_CLIP_MOZ_ALMOST_PADDING : NS_STYLE_BG_CLIP_PADDING;
     }
 
-    GetBackgroundClip(ctx, currentBackgroundClip, bg->BottomLayer().mAttachment,
-                      aForFrame, aBorderArea,
+    GetBackgroundClip(ctx, currentBackgroundClip, aForFrame, aBorderArea,
                       aDirtyRect, haveRoundedCorners, bgRadii, appUnitsPerPixel,
                       &clipState);
   }
 
   // If we might be using a background color, go ahead and set it now.
   if (drawBackgroundColor && !isCanvasFrame)
     ctx->SetColor(gfxRGBA(bgColor));
 
@@ -2720,17 +2652,17 @@ nsCSSRendering::PaintBackgroundWithSC(ns
             NS_STYLE_BG_CLIP_MOZ_ALMOST_PADDING : NS_STYLE_BG_CLIP_PADDING;
         }
         if (currentBackgroundClip != newBackgroundClip || !clipSet) {
           currentBackgroundClip = newBackgroundClip;
           // If clipSet is false that means this is the bottom layer and we
           // already called GetBackgroundClip above and it stored its results
           // in clipState.
           if (clipSet) {
-            GetBackgroundClip(ctx, currentBackgroundClip, layer.mAttachment, aForFrame,
+            GetBackgroundClip(ctx, currentBackgroundClip, aForFrame,
                               aBorderArea, aDirtyRect, haveRoundedCorners,
                               bgRadii, appUnitsPerPixel, &clipState);
           }
           SetupBackgroundClip(clipState, ctx, haveRoundedCorners,
                               appUnitsPerPixel, &autoSR);
           clipSet = true;
         }
       }
@@ -2827,18 +2759,17 @@ nsCSSRendering::PaintBackgroundColorWith
     // If we have rounded corners, we need to inflate the background
     // drawing area a bit to avoid seams between the border and
     // background.
     currentBackgroundClip = haveRoundedCorners ?
       NS_STYLE_BG_CLIP_MOZ_ALMOST_PADDING : NS_STYLE_BG_CLIP_PADDING;
   }
 
   BackgroundClipState clipState;
-  GetBackgroundClip(ctx, currentBackgroundClip, bg->BottomLayer().mAttachment,
-                    aForFrame, aBorderArea,
+  GetBackgroundClip(ctx, currentBackgroundClip, aForFrame, aBorderArea,
                     aDirtyRect, haveRoundedCorners, bgRadii, appUnitsPerPixel,
                     &clipState);
 
   ctx->SetColor(gfxRGBA(bgColor));
 
   gfxContextAutoSaveRestore autoSR;
   DrawBackgroundColor(clipState, ctx, haveRoundedCorners, appUnitsPerPixel);
 }
@@ -2892,41 +2823,16 @@ nsCSSRendering::ComputeBackgroundPositio
     geometryFrame = aForFrame->GetFirstPrincipalChild();
     // geometryFrame might be null if this canvas is a page created
     // as an overflow container (e.g. the in-flow content has already
     // finished and this page only displays the continuations of
     // absolutely positioned content).
     if (geometryFrame) {
       bgPositioningArea = geometryFrame->GetRect();
     }
-  } else if (frameType == nsGkAtoms::scrollFrame &&
-             NS_STYLE_BG_ATTACHMENT_LOCAL == aLayer.mAttachment) {
-    nsIScrollableFrame* scrollableFrame = do_QueryFrame(aForFrame);
-    bgPositioningArea = nsRect(
-      scrollableFrame->GetScrolledFrame()->GetPosition()
-        // For the dir=rtl case:
-        + scrollableFrame->GetScrollRange().TopLeft(),
-      scrollableFrame->GetScrolledRect().Size());
-    // The ScrolledRect’s size does not include the borders or scrollbars,
-    // reverse the handling of background-origin
-    // compared to the common case below.
-    if (aLayer.mOrigin == NS_STYLE_BG_ORIGIN_BORDER) {
-      nsMargin border = geometryFrame->GetUsedBorder();
-      geometryFrame->ApplySkipSides(border);
-      bgPositioningArea.Inflate(border);
-      bgPositioningArea.Inflate(scrollableFrame->GetActualScrollbarSizes());
-    } else if (aLayer.mOrigin != NS_STYLE_BG_ORIGIN_PADDING) {
-      nsMargin padding = geometryFrame->GetUsedPadding();
-      geometryFrame->ApplySkipSides(padding);
-      bgPositioningArea.Deflate(padding);
-      NS_ASSERTION(aLayer.mOrigin == NS_STYLE_BG_ORIGIN_CONTENT,
-                   "unknown background-origin value");
-    }
-    *aAttachedToFrame = aForFrame;
-    return bgPositioningArea;
   } else {
     bgPositioningArea = nsRect(nsPoint(0,0), aBorderArea.Size());
   }
 
   // Background images are tiled over the 'background-clip' area
   // but the origin of the tiling is based on the 'background-origin' area
   if (aLayer.mOrigin != NS_STYLE_BG_ORIGIN_BORDER && geometryFrame) {
     nsMargin border = geometryFrame->GetUsedBorder();
--- a/layout/base/nsStyleConsts.h
+++ b/layout/base/nsStyleConsts.h
@@ -228,17 +228,16 @@ static inline mozilla::css::Side operato
 
 // See nsStyleDisplay
 #define NS_STYLE_ANIMATION_PLAY_STATE_RUNNING     0
 #define NS_STYLE_ANIMATION_PLAY_STATE_PAUSED      1
 
 // See nsStyleBackground
 #define NS_STYLE_BG_ATTACHMENT_SCROLL     0
 #define NS_STYLE_BG_ATTACHMENT_FIXED      1
-#define NS_STYLE_BG_ATTACHMENT_LOCAL      2
 
 // See nsStyleBackground
 // Code depends on these constants having the same values as BG_ORIGIN_*
 #define NS_STYLE_BG_CLIP_BORDER           0
 #define NS_STYLE_BG_CLIP_PADDING          1
 #define NS_STYLE_BG_CLIP_CONTENT          2
 // A magic value that we use for our "pretend that background-clip is
 // 'padding' when we have a solid border" optimization.  This isn't
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -493,19 +493,16 @@ public:
     nsBoxLayoutState bls(aPresContext, aRC, 0);
     return GetDesiredScrollbarSizes(&bls);
   }
   virtual nscoord GetNondisappearingScrollbarWidth(nsPresContext* aPresContext,
           nsRenderingContext* aRC) MOZ_OVERRIDE {
     nsBoxLayoutState bls(aPresContext, aRC, 0);
     return mInner.GetNondisappearingScrollbarWidth(&bls);
   }
-  virtual nsRect GetScrolledRect() const MOZ_OVERRIDE {
-    return mInner.GetScrolledRect();
-  }
   virtual nsRect GetScrollPortRect() const MOZ_OVERRIDE {
     return mInner.GetScrollPortRect();
   }
   virtual nsPoint GetScrollPosition() const MOZ_OVERRIDE {
     return mInner.GetScrollPosition();
   }
   virtual nsPoint GetLogicalScrollPosition() const MOZ_OVERRIDE {
     return mInner.GetLogicalScrollPosition();
@@ -762,19 +759,16 @@ public:
     nsBoxLayoutState bls(aPresContext, aRC, 0);
     return GetDesiredScrollbarSizes(&bls);
   }
   virtual nscoord GetNondisappearingScrollbarWidth(nsPresContext* aPresContext,
           nsRenderingContext* aRC) MOZ_OVERRIDE {
     nsBoxLayoutState bls(aPresContext, aRC, 0);
     return mInner.GetNondisappearingScrollbarWidth(&bls);
   }
-  virtual nsRect GetScrolledRect() const MOZ_OVERRIDE {
-    return mInner.GetScrolledRect();
-  }
   virtual nsRect GetScrollPortRect() const MOZ_OVERRIDE {
     return mInner.GetScrollPortRect();
   }
   virtual nsPoint GetScrollPosition() const MOZ_OVERRIDE {
     return mInner.GetScrollPosition();
   }
   virtual nsPoint GetLogicalScrollPosition() const MOZ_OVERRIDE {
     return mInner.GetLogicalScrollPosition();
--- a/layout/generic/nsIScrollableFrame.h
+++ b/layout/generic/nsIScrollableFrame.h
@@ -83,31 +83,16 @@ public:
   virtual nsMargin GetDesiredScrollbarSizes(nsPresContext* aPresContext,
                                             nsRenderingContext* aRC) = 0;
   /**
    * Return the width for non-disappearing scrollbars.
    */
   virtual nscoord GetNondisappearingScrollbarWidth(nsPresContext* aPresContext,
                                                    nsRenderingContext* aRC) = 0;
   /**
-   * GetScrolledRect is designed to encapsulate deciding which
-   * directions of overflow should be reachable by scrolling and which
-   * should not.  Callers should NOT depend on it having any particular
-   * behavior (although nsXULScrollFrame currently does).
-   *
-   * This should only be called when the scrolled frame has been
-   * reflowed with the scroll port size given in mScrollPort.
-   *
-   * Currently it allows scrolling down and to the right for
-   * nsHTMLScrollFrames with LTR directionality and for all
-   * nsXULScrollFrames, and allows scrolling down and to the left for
-   * nsHTMLScrollFrames with RTL directionality.
-   */
-  virtual nsRect GetScrolledRect() const = 0;
-  /**
    * Get the area of the scrollport relative to the origin of this frame's
    * border-box.
    * This is the area of this frame minus border and scrollbars.
    */
   virtual nsRect GetScrollPortRect() const = 0;
   /**
    * Get the offset of the scrollport origin relative to the scrolled
    * frame origin. Typically the position will be non-negative.
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-1-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  background: green padding-box;
-}
-p {
-  margin-top: 5px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-1.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: green local border-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-2.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: green local padding-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-3-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 255px;
-  padding: 25px 40px 0;
-  border: 10px dashed;
-  background: green content-box;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-3.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: green local content-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-4-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  border-radius: 50%;
-  background: green padding-box;
-}
-p {
-  margin-top: 5px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-4.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: green local border-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-5.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: green local padding-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-6-ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-}
-#outer div {
-  background: green;
-  height: 500px;
-  margin-top: -15px;
-}
-p {
-  margin-top: 0;
-  padding-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-color-6.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: green local content-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-1-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  background: url(aqua-yellow-32x32.png) padding-box top -15px left 0;
-}
-p {
-  margin-top: 5px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-1.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: url(aqua-yellow-32x32.png) local;
-  background-clip: border-box;
-  background-origin: padding-box;  /* Match the reference. */
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-2.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: url(aqua-yellow-32x32.png) local padding-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-3-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 255px;
-  padding: 25px 40px 0;
-  border: 10px dashed;
-  background: url(aqua-yellow-32x32.png) content-box;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-3.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px dashed;
-  overflow: hidden;
-  background: url(aqua-yellow-32x32.png) local content-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-4-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  border-radius: 50%;
-  background: url(aqua-yellow-32x32.png) padding-box top -15px left 0;
-}
-p {
-  margin-top: 5px;
-}
-</style>
-<div id=outer>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-4.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: url(aqua-yellow-32x32.png) local;
-  background-clip: border-box;
-  background-origin: padding-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-5.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: url(aqua-yellow-32x32.png) local padding-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-6-ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-}
-#outer div {
-  background: url(aqua-yellow-32x32.png);
-  height: 500px;
-  margin-top: -15px;
-}
-p {
-  margin-top: 0;
-  padding-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-clipping-image-6.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-#outer {
-  width: 200px;
-  height: 200px;
-  padding: 40px;
-  border: 10px double;
-  overflow: hidden;
-  border-radius: 50%;
-  background: url(aqua-yellow-32x32.png) local content-box;
-}
-#outer div {
-  height: 500px;
-}
-p {
-  margin-top: 20px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Test</p>
-  </div>
-</div>
-<script>
-document.getElementById('outer').scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-1-ref.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html>
-<title>background-attachment: scroll</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) no-repeat 100px 100px;
-  overflow: hidden;
-  height: 200px;
-}
-p {
-  padding-top: 40px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-1.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title>background-attachment: scroll</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) no-repeat 100px 100px;
-  overflow: hidden;
-  height: 200px;
-}
-p {
-  padding-top: 100px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
-<script>
-document.getElementsByTagName('div')[0].scrollTop = 60;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-2-ref.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area</title>
-<style>
-#outer {
-  border: solid;
-  background: url(aqua-yellow-32x32.png) local no-repeat 178px 278px;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0 0 0 -40px;
-  padding-top: 40px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-2.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area</title>
-<style>
-#outer {
-  border: solid;
-  /* 100% 100% == (250px - 32px) (370px - 32px) == 218px 338px */
-  /* With scrolling, effective position is 178px 278px */
-  background: url(aqua-yellow-32x32.png) local no-repeat 100% 100%;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0;
-  padding-top: 100px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
-<script>
-var outer = document.getElementById('outer');
-outer.scrollLeft = 40;
-outer.scrollTop = 60;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-3-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area with dir=rtl</title>
-<style>
-#outer {
-  border: solid;
-  background: url(aqua-yellow-32x32.png) local no-repeat 178px 278px;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0;
-  padding-top: 100px;
-  text-align: right;
-  position: relative;
-  top: -60px;
-  left: -40px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-3.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area with dir=rtl</title>
-<style>
-#outer {
-  border: solid;
-  /* 100% 100% == (250px - 32px) (370px - 32px) == 218px 338px */
-  /* With scrolling, effective position is 178px 278px */
-  background: url(aqua-yellow-32x32.png) local no-repeat 100% 100%;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0;
-  padding-top: 100px;
-}
-</style>
-<div id=outer dir=rtl>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
-<script>
-var outer = document.getElementById('outer');
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=383026 for negative values.
-outer.scrollLeft = -10;
-outer.scrollTop = 60;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-4-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area with dir=rtl</title>
-<style>
-#outer {
-  border: solid;
-  background: url(aqua-yellow-32x32.png) local no-repeat -10px -10px;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0;
-  padding-top: 100px;
-  text-align: right;
-  position: relative;
-  top: -10px;
-  left: -10px;
-}
-</style>
-<div id=outer>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-4.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<title>background-attachment: local, positioning area with dir=rtl</title>
-<style>
-#outer {
-  border: solid;
-  /* With scrolling, effective position is -10px -10px */
-  background: url(aqua-yellow-32x32.png) local no-repeat 0 0;
-  overflow: hidden;
-  width: 200px;
-  height: 300px;
-}
-div div {
-  width: 250px;
-  height: 370px;
-}
-p {
-  margin: 0;
-  padding-top: 100px;
-}
-</style>
-<div id=outer dir=rtl>
-  <div>
-    <p>Lorem ipsum dolor sit amet</p>
-  </div>
-</div>
-<script>
-var outer = document.getElementById('outer');
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=383026 for negative values.
-outer.scrollLeft = -40;
-outer.scrollTop = 10;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-5-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) no-repeat 30px 25px;
-  overflow: hidden;
-  height: 200px;
-}
-p {
-  padding-left: 30px;
-  padding-top: 125px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-local-positioning-5.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!doctype html>
-<title>background-attachment: local</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) local no-repeat content-box;
-  overflow: hidden;
-  height: 200px;
-  padding: 40px 30px;
-}
-p {
-  padding-top: 100px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
-<script>
-document.getElementsByTagName('div')[0].scrollTop = 15;
-</script>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-scroll-positioning-1-ref.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html>
-<title>background-attachment: scroll</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) no-repeat 100px 100px;
-  overflow: hidden;
-  height: 200px;
-}
-p {
-  padding-top: 40px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
deleted file mode 100644
--- a/layout/reftests/backgrounds/attachment-scroll-positioning-1.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title>background-attachment: scroll</title>
-<style>
-div {
-  background: url(aqua-yellow-32x32.png) no-repeat 100px 100px;
-  overflow: hidden;
-  height: 200px;
-}
-p {
-  padding-top: 100px;
-  height: 500px;
-}
-</style>
-<div>
-  <p>Test</p>
-</div>
-<script>
-document.getElementsByTagName('div')[0].scrollTop = 60;
-</script>
--- a/layout/reftests/backgrounds/reftest.list
+++ b/layout/reftests/backgrounds/reftest.list
@@ -136,29 +136,8 @@ random-if(B2G) == really-big-background.
 == table-background-print.html table-background-print-ref.html
 != div-background.html div-background-ref.html
 
 == background-repeat-1-ref.html background-repeat-1.html
 
 == multi-background-clip-content-border.html multi-background-clip-content-border-ref.html
 
 HTTP == background-referrer.html background-referrer-ref.html
-
-== attachment-scroll-positioning-1.html attachment-scroll-positioning-1-ref.html
-== attachment-local-positioning-1.html attachment-local-positioning-1-ref.html
-== attachment-local-positioning-2.html attachment-local-positioning-2-ref.html
-== attachment-local-positioning-3.html attachment-local-positioning-3-ref.html
-== attachment-local-positioning-4.html attachment-local-positioning-4-ref.html
-== attachment-local-positioning-5.html attachment-local-positioning-5-ref.html
-
-== attachment-local-clipping-color-1.html attachment-local-clipping-color-1-ref.html
-== attachment-local-clipping-color-2.html attachment-local-clipping-color-1-ref.html  # Same ref as the previous test.
-== attachment-local-clipping-color-3.html attachment-local-clipping-color-3-ref.html
-== attachment-local-clipping-color-4.html attachment-local-clipping-color-4-ref.html
-== attachment-local-clipping-color-5.html attachment-local-clipping-color-4-ref.html  # Same ref as the previous test.
-fuzzy(40,330) == attachment-local-clipping-color-6.html attachment-local-clipping-color-6-ref.html
-
-== attachment-local-clipping-image-1.html attachment-local-clipping-image-1-ref.html
-== attachment-local-clipping-image-2.html attachment-local-clipping-image-1-ref.html  # Same ref as the previous test.
-== attachment-local-clipping-image-3.html attachment-local-clipping-image-3-ref.html
-== attachment-local-clipping-image-4.html attachment-local-clipping-image-4-ref.html
-== attachment-local-clipping-image-5.html attachment-local-clipping-image-4-ref.html  # Same ref as the previous test.
-fuzzy(70,330) == attachment-local-clipping-image-6.html attachment-local-clipping-image-6-ref.html
--- a/layout/style/nsCSSKeywordList.h
+++ b/layout/style/nsCSSKeywordList.h
@@ -320,17 +320,16 @@ CSS_KEY(landscape, landscape)
 CSS_KEY(large, large)
 CSS_KEY(larger, larger)
 CSS_KEY(left, left)
 CSS_KEY(lighter, lighter)
 CSS_KEY(line-through, line_through)
 CSS_KEY(linear, linear)
 CSS_KEY(lining-nums, lining_nums)
 CSS_KEY(list-item, list_item)
-CSS_KEY(local, local)
 CSS_KEY(logical, logical)
 CSS_KEY(lower-alpha, lower_alpha)
 CSS_KEY(lower-greek, lower_greek)
 CSS_KEY(lower-latin, lower_latin)
 CSS_KEY(lower-roman, lower_roman)
 CSS_KEY(lowercase, lowercase)
 CSS_KEY(ltr, ltr)
 CSS_KEY(luminance, luminance)
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -631,17 +631,16 @@ const int32_t nsCSSProps::kTransformStyl
   eCSSKeyword_flat, NS_STYLE_TRANSFORM_STYLE_FLAT,
   eCSSKeyword_preserve_3d, NS_STYLE_TRANSFORM_STYLE_PRESERVE_3D,
   eCSSKeyword_UNKNOWN,-1
 };
 
 const int32_t nsCSSProps::kBackgroundAttachmentKTable[] = {
   eCSSKeyword_fixed, NS_STYLE_BG_ATTACHMENT_FIXED,
   eCSSKeyword_scroll, NS_STYLE_BG_ATTACHMENT_SCROLL,
-  eCSSKeyword_local, NS_STYLE_BG_ATTACHMENT_LOCAL,
   eCSSKeyword_UNKNOWN,-1
 };
 
 const int32_t nsCSSProps::kBackgroundInlinePolicyKTable[] = {
   eCSSKeyword_each_box,     NS_STYLE_BG_INLINE_POLICY_EACH_BOX,
   eCSSKeyword_continuous,   NS_STYLE_BG_INLINE_POLICY_CONTINUOUS,
   eCSSKeyword_bounding_box, NS_STYLE_BG_INLINE_POLICY_BOUNDING_BOX,
   eCSSKeyword_UNKNOWN,-1
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -1358,17 +1358,17 @@ var gCSSProperties = {
 			"transparent padding-box url(404.png) padding-box",
 		]
 	},
 	"background-attachment": {
 		domProp: "backgroundAttachment",
 		inherited: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "scroll" ],
-		other_values: [ "fixed", "local", "scroll,scroll", "fixed, scroll", "scroll, fixed, local, scroll", "fixed, fixed" ],
+		other_values: [ "fixed", "scroll,scroll", "fixed, scroll", "scroll, fixed, scroll", "fixed, fixed" ],
 		invalid_values: []
 	},
 	"background-clip": {
 		/*
 		 * When we rename this to 'background-clip', we also
 		 * need to rename the values to match the spec.
 		 */
 		domProp: "backgroundClip",