diff --git a/Base/home/anon/www/raf.html b/Base/home/anon/www/raf.html
new file mode 100644
index 00000000000..25b9642b7af
--- /dev/null
+++ b/Base/home/anon/www/raf.html
@@ -0,0 +1,24 @@
+
+
+
rAF test
+
+
+
+
+
diff --git a/Base/home/anon/www/welcome.html b/Base/home/anon/www/welcome.html
index c2bb81c828e..d4d99a920a1 100644
--- a/Base/home/anon/www/welcome.html
+++ b/Base/home/anon/www/welcome.html
@@ -24,6 +24,7 @@ h1 {
Some small test pages:
- fun demo
+ - requestAnimationFrame test
- canvas 2D test
- simple DOM events test
- simple DOM JS test
diff --git a/Libraries/LibWeb/DOM/CanvasRenderingContext2D.cpp b/Libraries/LibWeb/DOM/CanvasRenderingContext2D.cpp
index 4e2bc49d7b7..393e26d2d3d 100644
--- a/Libraries/LibWeb/DOM/CanvasRenderingContext2D.cpp
+++ b/Libraries/LibWeb/DOM/CanvasRenderingContext2D.cpp
@@ -30,7 +30,19 @@ void CanvasRenderingContext2D::fill_rect(int x, int y, int width, int height)
if (!painter)
return;
- painter->fill_rect({ x, y, width, height }, m_fill_style);
+ Gfx::Rect rect(x, y, width, height);
+ painter->fill_rect(rect, m_fill_style);
+ did_draw(rect);
+}
+
+void CanvasRenderingContext2D::did_draw(const Gfx::Rect&)
+{
+ // FIXME: Make use of the rect to reduce the invalidated area when possible.
+ if (!m_element)
+ return;
+ if (!m_element->layout_node())
+ return;
+ m_element->layout_node()->set_needs_display();
}
OwnPtr CanvasRenderingContext2D::painter()
diff --git a/Libraries/LibWeb/DOM/CanvasRenderingContext2D.h b/Libraries/LibWeb/DOM/CanvasRenderingContext2D.h
index 8a367420156..ec84dfe815c 100644
--- a/Libraries/LibWeb/DOM/CanvasRenderingContext2D.h
+++ b/Libraries/LibWeb/DOM/CanvasRenderingContext2D.h
@@ -28,6 +28,8 @@ public:
private:
explicit CanvasRenderingContext2D(HTMLCanvasElement&);
+ void did_draw(const Gfx::Rect&);
+
OwnPtr painter();
WeakPtr m_element;
diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp
index f4a120bc6e9..4f7498c2ecc 100644
--- a/Libraries/LibWeb/DOM/Document.cpp
+++ b/Libraries/LibWeb/DOM/Document.cpp
@@ -28,6 +28,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -360,11 +361,25 @@ JS::Interpreter& Document::interpreter()
(void)Core::Timer::construct(
arguments[1].to_i32(), [this, callback] {
const_cast(static_cast(callback.cell()))->call(*m_interpreter, {});
- }).leak_ref();
+ })
+ .leak_ref();
return JS::js_undefined();
});
+ m_interpreter->global_object().put_native_function("requestAnimationFrame", [this](JS::Object*, const Vector& arguments) -> JS::Value {
+ if (arguments.size() < 1)
+ return JS::js_undefined();
+ ASSERT(arguments[0].is_object());
+ ASSERT(arguments[0].as_object()->is_function());
+ auto callback = make_handle(const_cast(arguments[0].as_object()));
+ i32 link_id = GUI::DisplayLink::register_callback([this, callback](i32 link_id) {
+ const_cast(static_cast(callback.cell()))->call(*m_interpreter, {});
+ GUI::DisplayLink::unregister_callback(link_id);
+ });
+ return JS::Value(link_id);
+ });
+
m_interpreter->global_object().put_native_property(
"document",
[this](JS::Object*) {