Project

General

Profile

Bug #7054 » 0002-Fix-WTableView-race-between-scrollTo-and-wtResize.patch

Bruce Toll, 05/15/2019 10:04 PM

View differences:

src/Wt/WTableView.C
viewportHeight_(UNKNOWN_VIEWPORT_HEIGHT),
scrollToRow_(-1),
scrollToHint_(ScrollHint::EnsureVisible),
columnResizeConnected_(false)
columnResizeConnected_(false),
scrollToCount_(0)
{
preloadMargin_[0] = preloadMargin_[1] = preloadMargin_[2] = preloadMargin_[3] = WLength();
......
}
}
void WTableView::onViewportChange(int left, int top, int width, int height)
void WTableView::onViewportChange(int left, int top, int width, int height, int scrollToCount)
{
assert(ajaxMode());
// ignore viewport change if it does not reflect latest scrollTo sent to client
if ((scrollToCount != -1) && (scrollToCount < scrollToCount_)) {
LOG_INFO("onViewportChange: Ignoring stale client resize");
return;
}
viewportLeft_ = left;
viewportWidth_ = width;
viewportTop_ = top;
......
}
if (isRendered()) {
scrollToCount_++;
WStringStream s;
s << jsRef() << ".wtObj.setScrollToPending();"
<< "setTimeout(function() {"
<< jsRef() << ".wtObj.scrollTo(-1, "
<< rowY << "," << (int)hint << "); }, 0);";
<< rowY << "," << (int)hint << ","
<< scrollToCount_ << "); }, 0);";
doJavaScript(s.str());
}
src/Wt/WTableView.h
WTable *plainTable_;
JSignal<int, int, std::string, std::string, WMouseEvent> dropEvent_;
JSignal<int, int, int, int> scrolled_;
JSignal<int, int, int, int, int> scrolled_;
JSignal<WTouchEvent> itemTouchSelectEvent_;
Signals::connection touchStartConnection_;
......
ScrollHint scrollToHint_;
bool columnResizeConnected_;
int scrollToCount_;
void updateTableBackground();
ColumnWidget *columnContainer(int renderedColumn) const;
......
virtual WWidget *headerWidget(int column, bool contentsOnly = true) override;
void onViewportChange(int left, int top, int width, int height);
void onViewportChange(int left, int top, int width, int height, int scrollToCount);
void onColumnResize();
void resetGeometry();
src/js/WTableView.js
var scrollX1 = 0, scrollX2 = 0, scrollY1 = 0, scrollY2 = 0;
var scrollToPending = 0;
var scrollToCount = 0;
/*
* We need to remember this for when going through a hide()
......
Math.round(rtlScrollLeft(contentsContainer)),
Math.round(contentsContainer.scrollTop),
Math.round(contentsContainer.clientWidth),
Math.round(contentsContainer.clientHeight));
Math.round(contentsContainer.clientHeight),
-1);
}
};
......
Math.round(rtlScrollLeft(o)),
Math.round(o.scrollTop),
Math.round(o.clientWidth),
Math.round(height));
Math.round(height),
scrollToCount);
}
};
......
this.resetScroll();
};
this.scrollTo = function(x, y, hint) {
if (scrollToPending > 0)
this.scrollTo = function(x, y, hint, scrollToCountServer) {
if (scrollToPending > 0) {
scrollToPending -= 1;
}
else {
scrollToCount = scrollToCountServer;
}
if (y != -1) {
var top = contentsContainer.scrollTop,
height = contentsContainer.clientHeight;
(4-4/4)