Skip to content

Commit 2e20cda

Browse files
committed
fix: fix ui command swap.
1 parent cb39af3 commit 2e20cda

File tree

4 files changed

+32
-12
lines changed

4 files changed

+32
-12
lines changed

bridge/foundation/shared_ui_command.cc

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ void SharedUICommand::SyncToReserve() {
7373
size_t waiting_size = waiting_buffer_->size();
7474
size_t origin_reserve_size = reserve_buffer_->size();
7575

76-
// if (reserve_buffer_->empty()) {
77-
// swap(reserve_buffer_, waiting_buffer_);
78-
// } else {
76+
if (reserve_buffer_->empty()) {
77+
swap(reserve_buffer_, waiting_buffer_);
78+
} else {
7979
appendCommand(reserve_buffer_, waiting_buffer_);
80-
// }
80+
}
8181

8282
assert(waiting_buffer_->empty());
8383
assert(reserve_buffer_->size() == waiting_size + origin_reserve_size);
@@ -100,11 +100,7 @@ void SharedUICommand::SyncToActive() {
100100

101101
size_t reserve_size = reserve_buffer_->size();
102102
size_t origin_active_size = active_buffer->size();
103-
// if (active_buffer->empty()) {
104-
// swap(active_buffer, reserve_buffer_);
105-
// } else {
106-
appendCommand(active_buffer, reserve_buffer_);
107-
// }
103+
appendCommand(active_buffer, reserve_buffer_);
108104
assert(reserve_buffer_->empty());
109105
assert(active_buffer->size() == reserve_size + origin_active_size);
110106
}
@@ -120,9 +116,7 @@ void SharedUICommand::appendCommand(std::unique_ptr<UICommandBuffer>& target,
120116
is_blocking_writing_.store(true, std::memory_order::memory_order_release);
121117

122118
UICommandItem* command_item = original->data();
123-
for (int i = 0; i < original->size(); i++) {
124-
target->addCommand(command_item[i]);
125-
}
119+
target->addCommands(command_item, original->size());
126120

127121
original->clear();
128122

bridge/foundation/ui_command_buffer.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,28 @@ void UICommandBuffer::addCommand(const UICommandItem& item, bool request_ui_upda
8686
size_++;
8787
}
8888

89+
void UICommandBuffer::addCommands(const webf::UICommandItem* items, int64_t item_size, bool request_ui_update) {
90+
if (UNLIKELY(!context_->dartIsolateContext()->valid())) {
91+
return;
92+
}
93+
94+
int64_t target_size = size_ + item_size;
95+
if (target_size > max_size_) {
96+
buffer_ = (UICommandItem*)realloc(buffer_, sizeof(UICommandItem) * target_size * 2);
97+
max_size_ = target_size * 2;
98+
}
99+
100+
#if FLUTTER_BACKEND
101+
if (UNLIKELY(request_ui_update && !update_batched_ && context_->IsContextValid())) {
102+
context_->dartMethodPtr()->requestBatchUpdate(context_->isDedicated(), context_->contextId());
103+
update_batched_ = true;
104+
}
105+
#endif
106+
107+
std::memcpy(buffer_ + size_, items, sizeof(UICommandItem) * item_size);
108+
size_ = target_size;
109+
}
110+
89111
UICommandItem* UICommandBuffer::data() {
90112
return buffer_;
91113
}

bridge/foundation/ui_command_buffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class UICommandBuffer {
8383

8484
private:
8585
void addCommand(const UICommandItem& item, bool request_ui_update = true);
86+
void addCommands(const UICommandItem* items, int64_t item_size, bool request_ui_update = true);
8687
void updateFlags(UICommand command);
8788

8889
ExecutingContext* context_{nullptr};

webf/lib/src/launcher/controller.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,9 @@ class WebFViewController implements WidgetsBindingObserver {
496496
}
497497

498498
void cloneNode(Pointer<NativeBindingObject> selfPtr, Pointer<NativeBindingObject> newPtr) {
499+
assert(hasBindingObject(selfPtr));
500+
assert(hasBindingObject(newPtr));
501+
499502
EventTarget? originalTarget = getBindingObject<EventTarget>(selfPtr);
500503
EventTarget? newTarget = getBindingObject<EventTarget>(newPtr);
501504

0 commit comments

Comments
 (0)