Add a Setting to make position:fixed form a new stacking context

https://bugs.webkit.org/show_bug.cgi?id=87186

Patch by James Robinson <jamesr@chromium.org> on 2012-05-23
Reviewed by Adam Barth.

Source/WebCore:

position:fixed elements form a new stacking context in several mobile WebKit ports and in the Qt port always. To
be consistent across devices, we want to try turning it on everywhere. This will likely cause compatibility
issues, so we need a runtime setting in order to stage the change carefully.

Tests: fast/block/positioning/fixed-position-stacking-context.html
       fast/block/positioning/fixed-position-stacking-context2.html

* css/StyleResolver.cpp:
(WebCore::StyleResolver::collectMatchingRulesForList):
* page/Settings.cpp:
(WebCore::Settings::Settings):
* page/Settings.h:
(WebCore::Settings::setFixedPositionCreatesStackingContext):
(WebCore::Settings::fixedPositionCreatesStackingContext):
(Settings):
* testing/InternalSettings.cpp:
(WebCore::InternalSettings::InternalSettings):
(WebCore::InternalSettings::restoreTo):
(WebCore::InternalSettings::setFixedPositionCreatesStackingContext):
(WebCore):
* testing/InternalSettings.h:
(InternalSettings):
* testing/InternalSettings.idl:

Source/WebKit/chromium:

* public/WebSettings.h:
* src/WebSettingsImpl.cpp:
(WebKit::WebSettingsImpl::setFixedPositionCreatesStackingContext):
(WebKit):
* src/WebSettingsImpl.h:
(WebSettingsImpl):

LayoutTests:

Adds layout tests that confirm we don't creates stacking contexts for position:fixed by default, but we do when
the fixedPositionCreatesStackingContext Setting is true.

Qt and Blackberry will need different expectations since they set this via an #ifdef

* fast/block/positioning/fixed-position-stacking-context-expected.png: Added.
* fast/block/positioning/fixed-position-stacking-context-expected.txt: Added.
* fast/block/positioning/fixed-position-stacking-context.html: Added.
* fast/block/positioning/fixed-position-stacking-context2-expected.png: Added.
* fast/block/positioning/fixed-position-stacking-context2-expected.txt: Added.
* fast/block/positioning/fixed-position-stacking-context2.html: Added.

git-svn-id: svn://svn.chromium.org/blink/trunk@118263 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 11436748
2012-05-23 James Robinson <jamesr@chromium.org>
Add a Setting to make position:fixed form a new stacking context
https://bugs.webkit.org/show_bug.cgi?id=87186
Reviewed by Adam Barth.
Adds layout tests that confirm we don't creates stacking contexts for position:fixed by default, but we do when
the fixedPositionCreatesStackingContext Setting is true.
Qt and Blackberry will need different expectations since they set this via an #ifdef
* fast/block/positioning/fixed-position-stacking-context-expected.png: Added.
* fast/block/positioning/fixed-position-stacking-context-expected.txt: Added.
* fast/block/positioning/fixed-position-stacking-context.html: Added.
* fast/block/positioning/fixed-position-stacking-context2-expected.png: Added.
* fast/block/positioning/fixed-position-stacking-context2-expected.txt: Added.
* fast/block/positioning/fixed-position-stacking-context2.html: Added.
2012-05-23 James Robinson <jamesr@chromium.org> 2012-05-23 James Robinson <jamesr@chromium.org>
[chromium] Turn ENABLE(OVERFLOW_SCROLLING) off for Chromium port [chromium] Turn ENABLE(OVERFLOW_SCROLLING) off for Chromium port
......
layer at (0,0) size 800x600
RenderView at (0,0) size 800x600
layer at (0,0) size 800x8
RenderBlock {HTML} at (0,0) size 800x8
RenderBody {BODY} at (8,8) size 784x0
layer at (0,0) size 100x100
RenderBlock (positioned) {DIV} at (0,0) size 100x100
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 1 {DIV} at (0,0) size 100x100 [bgcolor=#FF0000]
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 1 {DIV} at (0,0) size 100x100 [bgcolor=#FF0000]
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 2 {DIV} at (0,0) size 100x100 [bgcolor=#008000]
<!DOCTYPE html>
<title>Fixed position elements do not establish stacking contexts by default</title>
<style>
div {
height: 100px;
width: 100px;
margin: 0;
padding: 0;
top: 0;
left: 0;
position:fixed;
}
.red {
position:fixed;
background: red;
z-index: 1;
}
.green {
position:fixed;
background: green;
z-index: 2;
}
</style>
<div class="red"></div>
<div class="container">
<div class="red"></div>
<div class="green"></div>
</div>
layer at (0,0) size 800x600
RenderView at (0,0) size 800x600
layer at (0,0) size 800x8
RenderBlock {HTML} at (0,0) size 800x8
RenderBody {BODY} at (8,8) size 784x0
layer at (0,0) size 100x100
RenderBlock (positioned) {DIV} at (0,0) size 100x100
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 1 {DIV} at (0,0) size 100x100 [bgcolor=#008000]
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 2 {DIV} at (0,0) size 100x100 [bgcolor=#FF0000]
layer at (0,0) size 100x100
RenderBlock (positioned) zI: 1 {DIV} at (0,0) size 100x100 [bgcolor=#008000]
<!DOCTYPE html>
<title>Fixed position elements do establish stacking contexts with setting enabled</title>
<style>
div {
height: 100px;
width: 100px;
margin: 0;
padding: 0;
top: 0;
left: 0;
position:fixed;
}
.green {
position:fixed;
background: green;
z-index: 1;
}
.red {
position:fixed;
background: red;
z-index: 2;
}
</style>
<script>
if ("internals" in window) {
window.internals.settings.setFixedPositionCreatesStackingContext(true);
} else {
document.write("This test depends on the FixedPositionCreatesStackingContext setting being true, so run in DumpRenderTree or manually enable it");
}
</script>
<div class="green"></div>
<div class="container">
<div class="green"></div>
<div class="red"></div>
</div>
2012-05-23 James Robinson <jamesr@chromium.org>
Add a Setting to make position:fixed form a new stacking context
https://bugs.webkit.org/show_bug.cgi?id=87186
Reviewed by Adam Barth.
position:fixed elements form a new stacking context in several mobile WebKit ports and in the Qt port always. To
be consistent across devices, we want to try turning it on everywhere. This will likely cause compatibility
issues, so we need a runtime setting in order to stage the change carefully.
Tests: fast/block/positioning/fixed-position-stacking-context.html
fast/block/positioning/fixed-position-stacking-context2.html
* css/StyleResolver.cpp:
(WebCore::StyleResolver::collectMatchingRulesForList):
* page/Settings.cpp:
(WebCore::Settings::Settings):
* page/Settings.h:
(WebCore::Settings::setFixedPositionCreatesStackingContext):
(WebCore::Settings::fixedPositionCreatesStackingContext):
(Settings):
* testing/InternalSettings.cpp:
(WebCore::InternalSettings::InternalSettings):
(WebCore::InternalSettings::restoreTo):
(WebCore::InternalSettings::setFixedPositionCreatesStackingContext):
(WebCore):
* testing/InternalSettings.h:
(InternalSettings):
* testing/InternalSettings.idl:
2012-05-23 Michael Nordman <michaeln@google.com> 2012-05-23 Michael Nordman <michaeln@google.com>
[chromium] DomStorage events handling needs TLC (3) [chromium] DomStorage events handling needs TLC (3)
......
...@@ -2047,6 +2047,8 @@ void StyleResolver::adjustRenderStyle(RenderStyle* style, RenderStyle* parentSty ...@@ -2047,6 +2047,8 @@ void StyleResolver::adjustRenderStyle(RenderStyle* style, RenderStyle* parentSty
|| style->hasTransformRelatedProperty() || style->hasMask() || style->boxReflect() || style->hasFilter() || style->hasTransformRelatedProperty() || style->hasMask() || style->boxReflect() || style->hasFilter()
#ifdef FIXED_POSITION_CREATES_STACKING_CONTEXT #ifdef FIXED_POSITION_CREATES_STACKING_CONTEXT
|| style->position() == FixedPosition || style->position() == FixedPosition
#else
|| (style->position() == FixedPosition && e && e->document()->page()->settings()->fixedPositionCreatesStackingContext())
#endif #endif
#if ENABLE(OVERFLOW_SCROLLING) #if ENABLE(OVERFLOW_SCROLLING)
// Touch overflow scrolling creates a stacking context. // Touch overflow scrolling creates a stacking context.
......
...@@ -268,6 +268,7 @@ Settings::Settings(Page* page) ...@@ -268,6 +268,7 @@ Settings::Settings(Page* page)
, m_wantsBalancedSetDefersLoadingBehavior(false) , m_wantsBalancedSetDefersLoadingBehavior(false)
, m_requestAnimationFrameEnabled(true) , m_requestAnimationFrameEnabled(true)
, m_needsDidFinishLoadOrderQuirk(false) , m_needsDidFinishLoadOrderQuirk(false)
, m_fixedPositionCreatesStackingContext(false)
, m_loadsImagesAutomaticallyTimer(this, &Settings::loadsImagesAutomaticallyTimerFired) , m_loadsImagesAutomaticallyTimer(this, &Settings::loadsImagesAutomaticallyTimerFired)
, m_incrementalRenderingSuppressionTimeoutInSeconds(defaultIncrementalRenderingSuppressionTimeoutInSeconds) , m_incrementalRenderingSuppressionTimeoutInSeconds(defaultIncrementalRenderingSuppressionTimeoutInSeconds)
{ {
......
...@@ -570,6 +570,9 @@ namespace WebCore { ...@@ -570,6 +570,9 @@ namespace WebCore {
void setNeedsDidFinishLoadOrderQuirk(bool needsQuirk) { m_needsDidFinishLoadOrderQuirk = needsQuirk; } void setNeedsDidFinishLoadOrderQuirk(bool needsQuirk) { m_needsDidFinishLoadOrderQuirk = needsQuirk; }
bool needsDidFinishLoadOrderQuirk() const { return m_needsDidFinishLoadOrderQuirk; } bool needsDidFinishLoadOrderQuirk() const { return m_needsDidFinishLoadOrderQuirk; }
void setFixedPositionCreatesStackingContext(bool creates) { m_fixedPositionCreatesStackingContext = creates; }
bool fixedPositionCreatesStackingContext() const { return m_fixedPositionCreatesStackingContext; }
#if USE(JSC) #if USE(JSC)
static void setShouldRespectPriorityInCSSAttributeSetters(bool); static void setShouldRespectPriorityInCSSAttributeSetters(bool);
static bool shouldRespectPriorityInCSSAttributeSetters(); static bool shouldRespectPriorityInCSSAttributeSetters();
...@@ -738,6 +741,8 @@ namespace WebCore { ...@@ -738,6 +741,8 @@ namespace WebCore {
bool m_requestAnimationFrameEnabled : 1; bool m_requestAnimationFrameEnabled : 1;
bool m_needsDidFinishLoadOrderQuirk : 1; bool m_needsDidFinishLoadOrderQuirk : 1;
bool m_fixedPositionCreatesStackingContext : 1;
Timer<Settings> m_loadsImagesAutomaticallyTimer; Timer<Settings> m_loadsImagesAutomaticallyTimer;
void loadsImagesAutomaticallyTimerFired(Timer<Settings>*); void loadsImagesAutomaticallyTimerFired(Timer<Settings>*);
......
...@@ -99,6 +99,7 @@ InternalSettings::InternalSettings(Frame* frame) ...@@ -99,6 +99,7 @@ InternalSettings::InternalSettings(Frame* frame)
, m_originalShadowDOMEnabled(RuntimeEnabledFeatures::shadowDOMEnabled()) , m_originalShadowDOMEnabled(RuntimeEnabledFeatures::shadowDOMEnabled())
#endif #endif
, m_originalEditingBehavior(settings()->editingBehaviorType()) , m_originalEditingBehavior(settings()->editingBehaviorType())
, m_originalFixedPositionCreatesStackingContext(settings()->fixedPositionCreatesStackingContext())
{ {
} }
...@@ -111,6 +112,7 @@ void InternalSettings::restoreTo(Settings* settings) ...@@ -111,6 +112,7 @@ void InternalSettings::restoreTo(Settings* settings)
RuntimeEnabledFeatures::setShadowDOMEnabled(m_originalShadowDOMEnabled); RuntimeEnabledFeatures::setShadowDOMEnabled(m_originalShadowDOMEnabled);
#endif #endif
settings->setEditingBehaviorType(m_originalEditingBehavior); settings->setEditingBehaviorType(m_originalEditingBehavior);
settings->setFixedPositionCreatesStackingContext(m_originalFixedPositionCreatesStackingContext);
} }
Settings* InternalSettings::settings() const Settings* InternalSettings::settings() const
...@@ -344,4 +346,10 @@ void InternalSettings::setEditingBehavior(const String& editingBehavior, Excepti ...@@ -344,4 +346,10 @@ void InternalSettings::setEditingBehavior(const String& editingBehavior, Excepti
ec = SYNTAX_ERR; ec = SYNTAX_ERR;
} }
void InternalSettings::setFixedPositionCreatesStackingContext(bool creates, ExceptionCode& ec)
{
InternalSettingsGuardForFrameView();
settings()->setFixedPositionCreatesStackingContext(creates);
}
} }
...@@ -76,6 +76,7 @@ public: ...@@ -76,6 +76,7 @@ public:
void setCSSExclusionsEnabled(bool enabled, ExceptionCode&); void setCSSExclusionsEnabled(bool enabled, ExceptionCode&);
void setMediaPlaybackRequiresUserGesture(bool, ExceptionCode&); void setMediaPlaybackRequiresUserGesture(bool, ExceptionCode&);
void setEditingBehavior(const String&, ExceptionCode&); void setEditingBehavior(const String&, ExceptionCode&);
void setFixedPositionCreatesStackingContext(bool, ExceptionCode&);
void restoreTo(Settings*); void restoreTo(Settings*);
...@@ -93,6 +94,7 @@ private: ...@@ -93,6 +94,7 @@ private:
bool m_originalShadowDOMEnabled; bool m_originalShadowDOMEnabled;
#endif #endif
EditingBehaviorType m_originalEditingBehavior; EditingBehaviorType m_originalEditingBehavior;
bool m_originalFixedPositionCreatesStackingContext;
}; };
} // namespace WebCore } // namespace WebCore
......
...@@ -54,6 +54,7 @@ module window { ...@@ -54,6 +54,7 @@ module window {
void setCSSExclusionsEnabled(in boolean enabled) raises(DOMException); void setCSSExclusionsEnabled(in boolean enabled) raises(DOMException);
void setMediaPlaybackRequiresUserGesture(in boolean enabled) raises(DOMException); void setMediaPlaybackRequiresUserGesture(in boolean enabled) raises(DOMException);
void setEditingBehavior(in DOMString behavior) raises(DOMException); void setEditingBehavior(in DOMString behavior) raises(DOMException);
void setFixedPositionCreatesStackingContext(in boolean creates) raises(DOMException);
}; };
} }
2012-05-23 James Robinson <jamesr@chromium.org>
Add a Setting to make position:fixed form a new stacking context
https://bugs.webkit.org/show_bug.cgi?id=87186
Reviewed by Adam Barth.
* public/WebSettings.h:
* src/WebSettingsImpl.cpp:
(WebKit::WebSettingsImpl::setFixedPositionCreatesStackingContext):
(WebKit):
* src/WebSettingsImpl.h:
(WebSettingsImpl):
2012-05-23 James Robinson <jamesr@chromium.org> 2012-05-23 James Robinson <jamesr@chromium.org>
[chromium] Turn ENABLE(OVERFLOW_SCROLLING) off for Chromium port [chromium] Turn ENABLE(OVERFLOW_SCROLLING) off for Chromium port
......
...@@ -151,6 +151,7 @@ public: ...@@ -151,6 +151,7 @@ public:
virtual bool viewportEnabled() const = 0; virtual bool viewportEnabled() const = 0;
virtual void setDefaultTileSize(WebSize) = 0; virtual void setDefaultTileSize(WebSize) = 0;
virtual void setMaxUntiledLayerSize(WebSize) = 0; virtual void setMaxUntiledLayerSize(WebSize) = 0;
virtual void setFixedPositionCreatesStackingContext(bool) = 0;
protected: protected:
......
...@@ -586,6 +586,11 @@ void WebSettingsImpl::setMediaPlaybackRequiresUserGesture(bool required) ...@@ -586,6 +586,11 @@ void WebSettingsImpl::setMediaPlaybackRequiresUserGesture(bool required)
m_settings->setMediaPlaybackRequiresUserGesture(required); m_settings->setMediaPlaybackRequiresUserGesture(required);
} }
void WebSettingsImpl::setFixedPositionCreatesStackingContext(bool creates)
{
m_settings->setFixedPositionCreatesStackingContext(creates);
}
void WebSettingsImpl::setViewportEnabled(bool enabled) void WebSettingsImpl::setViewportEnabled(bool enabled)
{ {
m_viewportEnabled = enabled; m_viewportEnabled = enabled;
......
...@@ -142,6 +142,7 @@ public: ...@@ -142,6 +142,7 @@ public:
virtual void setPerTilePaintingEnabled(bool); virtual void setPerTilePaintingEnabled(bool);
virtual void setPartialSwapEnabled(bool); virtual void setPartialSwapEnabled(bool);
virtual void setThreadedAnimationEnabled(bool); virtual void setThreadedAnimationEnabled(bool);
virtual void setFixedPositionCreatesStackingContext(bool);
virtual void setViewportEnabled(bool); virtual void setViewportEnabled(bool);
virtual void setMediaPlaybackRequiresUserGesture(bool); virtual void setMediaPlaybackRequiresUserGesture(bool);
virtual bool viewportEnabled() const { return m_viewportEnabled; } virtual bool viewportEnabled() const { return m_viewportEnabled; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment