blob: 887dae0da68239b21c9b67aef0caf43d23bf9db1 [file] [log] [blame]
// Copyright 2019 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/html/lazy_load_image_observer.h"
#include "third_party/blink/renderer/core/dom/node_computed_style.h"
#include "third_party/blink/renderer/core/frame/local_frame_view.h"
#include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/core/html/html_element.h"
#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
#include "third_party/blink/renderer/core/style/style_image.h"
#include "third_party/blink/renderer/core/testing/sim/sim_compositor.h"
#include "third_party/blink/renderer/core/testing/sim/sim_request.h"
#include "third_party/blink/renderer/core/testing/sim/sim_test.h"
#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
namespace blink {
namespace {
class LazyLoadImagesSimTest : public SimTest {
protected:
LazyLoadImagesSimTest() : scoped_lazy_image_loading_for_test_(true) {}
void SetLazyLoadEnabled(bool enabled) {
WebView().GetPage()->GetSettings().SetLazyLoadEnabled(enabled);
}
void LoadMainResource() {
SimRequest main_resource("https://example.com/", "text/html");
LoadURL("https://example.com/");
main_resource.Complete(String::Format(R"HTML(
<style>
#deferred_image {
height:200px;
background-image: url('img.jpg');
}
</style>
<div style='height:10000px;'></div>
<div id="deferred_image"></div>
)HTML"));
}
void ExpectCSSBackgroundImageDeferredState(bool deferred) {
const ComputedStyle* deferred_image_style =
GetDocument().getElementById("deferred_image")->GetComputedStyle();
EXPECT_TRUE(deferred_image_style->HasBackgroundImage());
bool is_background_image_found = false;
for (const FillLayer* background_layer =
&deferred_image_style->BackgroundLayers();
background_layer; background_layer = background_layer->Next()) {
if (StyleImage* deferred_image = background_layer->GetImage()) {
EXPECT_TRUE(deferred_image->IsImageResource());
EXPECT_EQ(deferred, deferred_image->IsLazyloadPossiblyDeferred());
EXPECT_NE(deferred, deferred_image->IsLoaded());
is_background_image_found = true;
}
}
EXPECT_TRUE(is_background_image_found);
}
private:
ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test_;
};
TEST_F(LazyLoadImagesSimTest, CSSBackgroundImageLoadedWithoutLazyLoad) {
SetLazyLoadEnabled(false);
SimRequest image_resource("https://example.com/img.jpg", "image/jpeg");
LoadMainResource();
image_resource.Complete("");
Compositor().BeginFrame();
test::RunPendingTasks();
ExpectCSSBackgroundImageDeferredState(false);
}
TEST_F(LazyLoadImagesSimTest, CSSBackgroundImageDeferredWithLazyLoad) {
SetLazyLoadEnabled(true);
LoadMainResource();
Compositor().BeginFrame();
test::RunPendingTasks();
ExpectCSSBackgroundImageDeferredState(true);
// Scroll down until the background image is visible.
GetDocument().View()->LayoutViewport()->SetScrollOffset(
ScrollOffset(0, 10000), kProgrammaticScroll);
SimRequest image_resource("https://example.com/img.jpg", "image/jpeg");
Compositor().BeginFrame();
test::RunPendingTasks();
image_resource.Complete("");
ExpectCSSBackgroundImageDeferredState(false);
}
} // namespace
} // namespace blink