summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-05-15 10:20:33 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-05-15 10:28:57 +0000
commitd17ea114e5ef69ad5d5d7413280a13e6428098aa (patch)
tree2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
parent8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff)
downloadqtwebengine-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.cc171
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