diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:20:33 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:28:57 +0000 |
commit | d17ea114e5ef69ad5d5d7413280a13e6428098aa (patch) | |
tree | 2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc | |
parent | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff) | |
download | qtwebengine-chromium-d17ea114e5ef69ad5d5d7413280a13e6428098aa.tar.gz |
BASELINE: Update Chromium to 67.0.3396.47
Change-Id: Idcb1341782e417561a2473eeecc82642dafda5b7
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc b/chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc new file mode 100644 index 00000000000..1b1128a3b5a --- /dev/null +++ b/chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc @@ -0,0 +1,171 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/svg/graphics/svg_image.h" + +#include <memory> + +#include "base/memory/ptr_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" +#include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/core/layout/layout_view.h" +#include "third_party/blink/renderer/core/paint/paint_layer.h" +#include "third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.h" +#include "third_party/blink/renderer/platform/geometry/float_rect.h" +#include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h" +#include "third_party/blink/renderer/platform/graphics/paint/paint_flags.h" +#include "third_party/blink/renderer/platform/shared_buffer.h" +#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" +#include "third_party/blink/renderer/platform/timer.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/utils/SkNullCanvas.h" + +namespace blink { +class SVGImageTest : public testing::Test { + public: + SVGImage& GetImage() { return *image_; } + + void Load(const char* data, bool should_pause) { + observer_ = new PauseControlImageObserver(should_pause); + image_ = SVGImage::Create(observer_); + image_->SetData(SharedBuffer::Create(data, strlen(data)), true); + } + + void PumpFrame() { + Image* image = image_.get(); + std::unique_ptr<SkCanvas> null_canvas = SkMakeNullCanvas(); + SkiaPaintCanvas canvas(null_canvas.get()); + PaintFlags flags; + FloatRect dummy_rect(0, 0, 100, 100); + image->Draw(&canvas, flags, dummy_rect, dummy_rect, + kDoNotRespectImageOrientation, + Image::kDoNotClampImageToSourceRect, Image::kSyncDecode); + } + + private: + class PauseControlImageObserver + : public GarbageCollectedFinalized<PauseControlImageObserver>, + public ImageObserver { + USING_GARBAGE_COLLECTED_MIXIN(PauseControlImageObserver); + + public: + PauseControlImageObserver(bool should_pause) + : should_pause_(should_pause) {} + + void DecodedSizeChangedTo(const Image*, size_t new_size) override {} + + bool ShouldPauseAnimation(const Image*) override { return should_pause_; } + void AnimationAdvanced(const Image*) override {} + + void ChangedInRect(const Image*, const IntRect&) override {} + + void AsyncLoadCompleted(const blink::Image*) override {} + + virtual void Trace(blink::Visitor* visitor) { + ImageObserver::Trace(visitor); + } + + private: + bool should_pause_; + }; + Persistent<PauseControlImageObserver> observer_; + scoped_refptr<SVGImage> image_; +}; + +const char kAnimatedDocument[] = + "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'>" + "<style>" + "@keyframes rot {" + " from { transform: rotate(0deg); } to { transform: rotate(-360deg); }" + "}" + ".spinner {" + " transform-origin: 50%% 50%%;" + " animation-name: rot;" + " animation-duration: 4s;" + " animation-iteration-count: infinite;" + " animation-timing-function: linear;" + "}" + "</style>" + "<path class='spinner' fill='none' d='M 8,1.125 A 6.875,6.875 0 1 1 " + "1.125,8' stroke-width='2' stroke='blue'/>" + "</svg>"; + +TEST_F(SVGImageTest, TimelineSuspendAndResume) { + const bool kShouldPause = true; + Load(kAnimatedDocument, kShouldPause); + SVGImageChromeClient& chrome_client = GetImage().ChromeClientForTesting(); + TaskRunnerTimer<SVGImageChromeClient>* timer = + new TaskRunnerTimer<SVGImageChromeClient>( + scheduler::GetSingleThreadTaskRunnerForTesting(), &chrome_client, + &SVGImageChromeClient::AnimationTimerFired); + chrome_client.SetTimer(base::WrapUnique(timer)); + + // Simulate a draw. Cause a frame (timer) to be scheduled. + PumpFrame(); + EXPECT_TRUE(GetImage().MaybeAnimated()); + EXPECT_TRUE(timer->IsActive()); + + // Fire the timer/trigger a frame update. Since the observer always returns + // true for shouldPauseAnimation, this will result in the timeline being + // suspended. + test::RunDelayedTasks(TimeDelta::FromMilliseconds(1) + + TimeDelta::FromSecondsD(timer->NextFireInterval())); + EXPECT_TRUE(chrome_client.IsSuspended()); + EXPECT_FALSE(timer->IsActive()); + + // Simulate a draw. This should resume the animation again. + PumpFrame(); + EXPECT_TRUE(timer->IsActive()); + EXPECT_FALSE(chrome_client.IsSuspended()); +} + +TEST_F(SVGImageTest, ResetAnimation) { + const bool kShouldPause = false; + Load(kAnimatedDocument, kShouldPause); + SVGImageChromeClient& chrome_client = GetImage().ChromeClientForTesting(); + TaskRunnerTimer<SVGImageChromeClient>* timer = + new TaskRunnerTimer<SVGImageChromeClient>( + scheduler::GetSingleThreadTaskRunnerForTesting(), &chrome_client, + &SVGImageChromeClient::AnimationTimerFired); + chrome_client.SetTimer(base::WrapUnique(timer)); + + // Simulate a draw. Cause a frame (timer) to be scheduled. + PumpFrame(); + EXPECT_TRUE(GetImage().MaybeAnimated()); + EXPECT_TRUE(timer->IsActive()); + + // Reset the animation. This will suspend the timeline but not cancel the + // timer. + GetImage().ResetAnimation(); + EXPECT_TRUE(chrome_client.IsSuspended()); + EXPECT_TRUE(timer->IsActive()); + + // Fire the timer/trigger a frame update. The timeline will remain + // suspended and no frame will be scheduled. + test::RunDelayedTasks(TimeDelta::FromMillisecondsD(1) + + TimeDelta::FromSecondsD(timer->NextFireInterval())); + EXPECT_TRUE(chrome_client.IsSuspended()); + EXPECT_FALSE(timer->IsActive()); + + // Simulate a draw. This should resume the animation again. + PumpFrame(); + EXPECT_FALSE(chrome_client.IsSuspended()); + EXPECT_TRUE(timer->IsActive()); +} + +TEST_F(SVGImageTest, SupportsSubsequenceCaching) { + const bool kShouldPause = true; + Load(kAnimatedDocument, kShouldPause); + PumpFrame(); + LocalFrame* local_frame = + ToLocalFrame(GetImage().GetPageForTesting()->MainFrame()); + EXPECT_TRUE(local_frame->GetDocument()->IsSVGDocument()); + LayoutObject* svg_root = local_frame->View()->GetLayoutView()->FirstChild(); + EXPECT_TRUE(svg_root->IsSVGRoot()); + EXPECT_TRUE( + ToLayoutBoxModelObject(svg_root)->Layer()->SupportsSubsequenceCaching()); +} + +} // namespace blink |