mirror of
https://github.com/servo/servo.git
synced 2025-08-07 22:45:34 +01:00
Implement CEReactions codegen
This commit is contained in:
parent
e57ed3d42f
commit
438191e0b2
4 changed files with 73 additions and 15 deletions
|
@ -33,6 +33,7 @@ use microtask::Microtask;
|
|||
use script_thread::ScriptThread;
|
||||
use std::cell::Cell;
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::mem;
|
||||
use std::ops::Deref;
|
||||
use std::ptr;
|
||||
use std::rc::Rc;
|
||||
|
@ -495,6 +496,7 @@ enum BackupElementQueueFlag {
|
|||
#[derive(HeapSizeOf, JSTraceable)]
|
||||
#[must_root]
|
||||
pub struct CustomElementReactionStack {
|
||||
stack: DOMRefCell<Vec<ElementQueue>>,
|
||||
backup_queue: ElementQueue,
|
||||
processing_backup_element_queue: Cell<BackupElementQueueFlag>,
|
||||
}
|
||||
|
@ -502,11 +504,29 @@ pub struct CustomElementReactionStack {
|
|||
impl CustomElementReactionStack {
|
||||
pub fn new() -> CustomElementReactionStack {
|
||||
CustomElementReactionStack {
|
||||
stack: DOMRefCell::new(Vec::new()),
|
||||
backup_queue: ElementQueue::new(),
|
||||
processing_backup_element_queue: Cell::new(BackupElementQueueFlag::NotProcessing),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn push_new_element_queue(&self) {
|
||||
self.stack.borrow_mut().push(ElementQueue::new());
|
||||
}
|
||||
|
||||
pub fn pop_current_element_queue(&self) {
|
||||
rooted_vec!(let mut stack);
|
||||
mem::swap(&mut *stack, &mut *self.stack.borrow_mut());
|
||||
|
||||
if let Some(current_queue) = stack.last() {
|
||||
current_queue.invoke_reactions();
|
||||
}
|
||||
stack.pop();
|
||||
|
||||
mem::swap(&mut *self.stack.borrow_mut(), &mut *stack);
|
||||
self.stack.borrow_mut().append(&mut *stack);
|
||||
}
|
||||
|
||||
/// https://html.spec.whatwg.org/multipage/#enqueue-an-element-on-the-appropriate-element-queue
|
||||
/// Step 4
|
||||
pub fn invoke_backup_element_queue(&self) {
|
||||
|
@ -519,22 +539,24 @@ impl CustomElementReactionStack {
|
|||
|
||||
/// https://html.spec.whatwg.org/multipage/#enqueue-an-element-on-the-appropriate-element-queue
|
||||
pub fn enqueue_element(&self, element: &Element) {
|
||||
// TODO: Steps 1 - 2
|
||||
// Support multiple queues
|
||||
if let Some(current_queue) = self.stack.borrow().last() {
|
||||
// Step 2
|
||||
current_queue.append_element(element);
|
||||
} else {
|
||||
// Step 1.1
|
||||
self.backup_queue.append_element(element);
|
||||
|
||||
// Step 1.1
|
||||
self.backup_queue.append_element(element);
|
||||
// Step 1.2
|
||||
if self.processing_backup_element_queue.get() == BackupElementQueueFlag::Processing {
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 1.2
|
||||
if self.processing_backup_element_queue.get() == BackupElementQueueFlag::Processing {
|
||||
return;
|
||||
// Step 1.3
|
||||
self.processing_backup_element_queue.set(BackupElementQueueFlag::Processing);
|
||||
|
||||
// Step 4
|
||||
ScriptThread::enqueue_microtask(Microtask::CustomElementReaction);
|
||||
}
|
||||
|
||||
// Step 1.3
|
||||
self.processing_backup_element_queue.set(BackupElementQueueFlag::Processing);
|
||||
|
||||
// Step 4
|
||||
ScriptThread::enqueue_microtask(Microtask::CustomElementReaction);
|
||||
}
|
||||
|
||||
/// https://html.spec.whatwg.org/multipage/#enqueue-a-custom-element-callback-reaction
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue