Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: ui/aura/mus/window_port_mus.cc

Issue 2517853002: Fixes bug in handling restacking because of transients (Closed)
Patch Set: merge 2 trunk Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/aura/mus/window_port_mus.cc
diff --git a/ui/aura/mus/window_port_mus.cc b/ui/aura/mus/window_port_mus.cc
index 7797d107e40479042958345d1e8870b8e61342b1..d6ec918bd2e545853db3f16238d71d8227f0078b 100644
--- a/ui/aura/mus/window_port_mus.cc
+++ b/ui/aura/mus/window_port_mus.cc
@@ -111,8 +111,18 @@ void WindowPortMus::RemoveChangeById(ServerChangeIdType change_id) {
bool WindowPortMus::RemoveChangeByTypeAndData(const ServerChangeType type,
const ServerChangeData& data) {
- for (auto iter = server_changes_.begin(); iter != server_changes_.end();
- ++iter) {
+ auto iter = FindServerChangeByTypeAndData(type, data);
+ if (iter == server_changes_.end())
+ return false;
+ server_changes_.erase(iter);
+ return true;
+}
+
+WindowPortMus::ServerChanges::iterator
+WindowPortMus::FindServerChangeByTypeAndData(const ServerChangeType type,
+ const ServerChangeData& data) {
+ auto iter = server_changes_.begin();
+ for (; iter != server_changes_.end(); ++iter) {
if (iter->type != type)
continue;
@@ -122,29 +132,28 @@ bool WindowPortMus::RemoveChangeByTypeAndData(const ServerChangeType type,
case ServerChangeType::REMOVE:
case ServerChangeType::REMOVE_TRANSIENT:
case ServerChangeType::REORDER:
+ case ServerChangeType::TRANSIENT_REORDER:
if (iter->data.child_id == data.child_id)
- break;
- continue;
+ return iter;
+ break;
case ServerChangeType::BOUNDS:
if (iter->data.bounds == data.bounds)
- break;
- continue;
+ return iter;
+ break;
case ServerChangeType::DESTROY:
// No extra data for delete.
- break;
+ return iter;
case ServerChangeType::PROPERTY:
if (iter->data.property_name == data.property_name)
- break;
- continue;
+ return iter;
+ break;
case ServerChangeType::VISIBLE:
if (iter->data.visible == data.visible)
- break;
- continue;
+ return iter;
+ break;
}
- server_changes_.erase(iter);
- return true;
}
- return false;
+ return iter;
}
PropertyConverter* WindowPortMus::GetPropertyConverter() {
@@ -309,6 +318,20 @@ WindowPortMus::PrepareForServerBoundsChange(const gfx::Rect& bounds) {
return std::move(data);
}
+void WindowPortMus::PrepareForTransientRestack(WindowMus* window) {
+ ServerChangeData change_data;
+ change_data.child_id = window->server_id();
+ ScheduleChange(ServerChangeType::TRANSIENT_REORDER, change_data);
+}
+
+void WindowPortMus::OnTransientRestackDone(WindowMus* window) {
+ ServerChangeData change_data;
+ change_data.child_id = window->server_id();
+ const bool removed = RemoveChangeByTypeAndData(
+ ServerChangeType::TRANSIENT_REORDER, change_data);
+ DCHECK(removed);
msw 2016/11/21 19:56:34 Just so I understand: is OnTransientRestackDone on
sky 2016/11/21 21:31:43 OnTransientRestackDone is always called.
msw 2016/11/21 22:34:49 Okay, so the transient reordering step sometimes d
sky 2016/11/21 22:41:10 You got it.
+}
+
std::unique_ptr<WindowMusChangeData>
WindowPortMus::PrepareForServerVisibilityChange(bool value) {
std::unique_ptr<WindowMusChangeDataImpl> data(
@@ -352,8 +375,13 @@ void WindowPortMus::OnWillRemoveChild(Window* child) {
void WindowPortMus::OnWillMoveChild(size_t current_index, size_t dest_index) {
ServerChangeData change_data;
change_data.child_id = Get(window_->children()[current_index])->server_id();
- if (!RemoveChangeByTypeAndData(ServerChangeType::REORDER, change_data))
+ // See description of TRANSIENT_REORDER for details on why it isn't removed
+ // here.
+ if (!RemoveChangeByTypeAndData(ServerChangeType::REORDER, change_data) &&
+ FindServerChangeByTypeAndData(ServerChangeType::TRANSIENT_REORDER,
+ change_data) == server_changes_.end()) {
window_tree_client_->OnWindowMusMoveChild(this, current_index, dest_index);
+ }
}
void WindowPortMus::OnVisibilityChanged(bool visible) {

Powered by Google App Engine
This is Rietveld 408576698