Bug 213277

Summary: [WinCairo][WK2] The entire content area is unnecessarily repainted just by clicking a text
Product: WebKit Reporter: Fujii Hironori <Hironori.Fujii>
Component: WebKit2Assignee: Nobody <webkit-unassigned>
Status: NEW ---    
Severity: Normal    
Priority: P2    
Version: WebKit Nightly Build   
Hardware: Unspecified   
OS: Unspecified   

Description Fujii Hironori 2020-06-16 17:32:13 PDT
[WinCairo]  The entire content area is repainted unnecessarily just by clicking a text

I observe this issue with WinCairo WebKit2, but not with WinCairo WebKit1.
You need to use your debugger to obverse this issue.

1. Put a break point at DrawingAreaCoordinatedGraphics::setNeedsDisplay in web process
2. Open a simple non-AC mode page. For example, http://example.com/
3. Click a text in the page
4. The break point is hit

Callstack:

> WebKit2.dll!WebKit::DrawingAreaCoordinatedGraphics::setNeedsDisplay() Line 91	C++
> WebKit2.dll!WebKit::DrawingAreaCoordinatedGraphics::scheduleRenderingUpdate() Line 355	C++
> WebKit2.dll!WebKit::WebPage::scheduleFullEditorStateUpdate() Line 6309	C++
> WebKit2.dll!WebKit::WebPage::didChangeSelectionOrOverflowScrollPosition() Line 5592	C++
> WebKit2.dll!WebKit::WebPage::didChangeSelection() Line 5544	C++
> WebKit2.dll!WebKit::WebEditorClient::respondToChangedSelection(WebCore::Frame * frame=0x00000159996a9d10) Line 247	C++
> WebKit2.dll!WebCore::Editor::respondToChangedSelection(const WebCore::VisibleSelection & __formal={...}, WTF::OptionSet<enum WebCore::FrameSelection::SetSelectionOption> options={...}) Line 3669	C++
> WebKit2.dll!WebCore::FrameSelection::setSelectionWithoutUpdatingAppearance(const WebCore::VisibleSelection & newSelectionPossiblyWithoutDirection={...}, WTF::OptionSet<enum WebCore::FrameSelection::SetSelectionOption> options={...}, WebCore::FrameSelection::CursorAlignOnScroll align=AlignCursorOnScrollIfNeeded, WebCore::TextGranularity granularity=CharacterGranularity) Line 402	C++
> WebKit2.dll!WebCore::FrameSelection::setSelection(const WebCore::VisibleSelection & selection={...}, WTF::OptionSet<enum WebCore::FrameSelection::SetSelectionOption> options={...}, WebCore::AXTextStateChangeIntent intent={...}, WebCore::FrameSelection::CursorAlignOnScroll align=AlignCursorOnScrollIfNeeded, WebCore::TextGranularity granularity=CharacterGranularity) Line 412	C++
> WebKit2.dll!WebCore::FrameSelection::setSelectionByMouseIfDifferent(const WebCore::VisibleSelection & passedNewSelection={...}, WebCore::TextGranularity granularity=CharacterGranularity, WebCore::FrameSelection::EndPointsAdjustmentMode endpointsAdjustmentMode=DoNotAdjust) Line 329	C++
> WebKit2.dll!WebCore::EventHandler::updateSelectionForMouseDownDispatchingSelectStart(WebCore::Node * targetNode=0x00000159dda58010, const WebCore::VisibleSelection & selection={...}, WebCore::TextGranularity granularity=CharacterGranularity) Line 551	C++
> WebKit2.dll!WebCore::EventHandler::handleMousePressEventSingleClick(const WebCore::MouseEventWithHitTestResults & event={...}) Line 754	C++
> WebKit2.dll!WebCore::EventHandler::handleMousePressEvent(const WebCore::MouseEventWithHitTestResults & event={...}) Line 853	C++
> WebKit2.dll!WebCore::EventHandler::handleMousePressEvent(const WebCore::PlatformMouseEvent & platformMouseEvent={...}) Line 1851	C++
> WebKit2.dll!WebCore::UserInputBridge::handleMousePressEvent(const WebCore::PlatformMouseEvent & mouseEvent={...}, WebCore::InputSource __formal=User) Line 58	C++
> WebKit2.dll!WebKit::handleMouseEvent(const WebKit::WebMouseEvent & mouseEvent={...}, WebKit::WebPage * page=0x0000015999677330) Line 2721	C++
> WebKit2.dll!WebKit::WebPage::mouseEvent(const WebKit::WebMouseEvent & mouseEvent={...}) Line 2788	C++
> WebKit2.dll!IPC::callMemberFunctionImpl<WebKit::WebPage,void (__cdecl WebKit::WebPage::*)(WebKit::WebMouseEvent const &),std::tuple<WebKit::WebMouseEvent>,0>(WebKit::WebPage * object=0x0000015999677330, void(WebKit::WebPage::*)(const WebKit::WebMouseEvent &) function=0x00000022be0fd5b0, std::tuple<WebKit::WebMouseEvent> && args={...}, std::integer_sequence<unsigned __int64,0> __formal={...}) Line 42	C++
> WebKit2.dll!IPC::callMemberFunction<WebKit::WebPage,void (__cdecl WebKit::WebPage::*)(WebKit::WebMouseEvent const &),std::tuple<WebKit::WebMouseEvent>,std::integer_sequence<unsigned __int64,0>>(std::tuple<WebKit::WebMouseEvent> && args={...}, WebKit::WebPage * object=0x0000015999677330, void(WebKit::WebPage::*)(const WebKit::WebMouseEvent &) function=0x00000022be0fd690) Line 48	C++
> WebKit2.dll!IPC::handleMessage<Messages::WebPage::MouseEvent,WebKit::WebPage,void (__cdecl WebKit::WebPage::*)(WebKit::WebMouseEvent const &)>(IPC::Decoder & decoder={...}, WebKit::WebPage * object=0x0000015999677330, void(WebKit::WebPage::*)(const WebKit::WebMouseEvent &) function=0x00000022be0fe360) Line 115	C++
> WebKit2.dll!WebKit::WebPage::didReceiveWebPageMessage(IPC::Connection & connection={...}, IPC::Decoder & decoder={...}) Line 1072	C++
> WebKit2.dll!WebKit::WebPage::didReceiveMessage(IPC::Connection & connection={...}, IPC::Decoder & decoder={...}) Line 4607	C++
> WebKit2.dll!IPC::MessageReceiverMap::dispatchMessage(IPC::Connection & connection={...}, IPC::Decoder & decoder={...}) Line 124	C++
> WebKit2.dll!WebKit::WebProcess::didReceiveMessage(IPC::Connection & connection={...}, IPC::Decoder & decoder={...}) Line 770	C++
> WebKit2.dll!IPC::Connection::dispatchMessage(IPC::Decoder & decoder={...}) Line 1002	C++
> WebKit2.dll!IPC::Connection::dispatchMessage(std::unique_ptr<IPC::Decoder,std::default_delete<IPC::Decoder>> message={...}) Line 1072	C++
> WebKit2.dll!IPC::Connection::dispatchOneIncomingMessage() Line 1140	C++
> WebKit2.dll!IPC::Connection::enqueueIncomingMessage::__l2::<lambda>() Line 979	C++
> WebKit2.dll!WTF::Detail::CallableWrapper<void <lambda>(void),void>::call() Line 52	C++
> WTF.dll!WTF::Function<void __cdecl(void)>::operator()() Line 85	C++
> WTF.dll!WTF::RunLoop::performWork() Line 141	C++
> WTF.dll!WTF::RunLoop::wndProc(HWND__ * hWnd=0x0000000000390bfe, unsigned int message=1025, unsigned __int64 wParam=1484337169072, __int64 lParam=0) Line 57	C++
> WTF.dll!WTF::RunLoop::RunLoopWndProc(HWND__ * hWnd=0x0000000000390bfe, unsigned int message=1025, unsigned __int64 wParam=1484337169072, __int64 lParam=0) Line 39	C++
> user32.dll!00007ffb15755c0d()	Unknown
> user32.dll!00007ffb15755602()	Unknown
> WTF.dll!WTF::RunLoop::run() Line 74	C++
> WebKit2.dll!WebKit::AuxiliaryProcessMain<WebKit::WebProcess,WebKit::WebProcessMainWin>(int argc=7, char * * argv=0x0000015999626fe0) Line 69	C++
> WebKit2.dll!WebKit::WebProcessMain(int argc=7, char * * argv=0x0000015999626fe0) Line 58	C++
> WebKitWebProcess.exe!main(int argc=7, char * * argv=0x0000015999626fe0) Line 35	C++
> [Inline Frame] WebKitWebProcess.exe!invoke_main() Line 78	C++
> WebKitWebProcess.exe!__scrt_common_main_seh() Line 288	C++
> kernel32.dll!00007ffb14ca7bd4()	Unknown
> ntdll.dll!00007ffb16c4ce51()	Unknown
Comment 1 Fujii Hironori 2020-06-16 19:23:12 PDT
There is a FIXME comment in WebPage::scheduleFullEditorStateUpdate()

>     // FIXME: Scheduling a compositing layer flush here can be more expensive than necessary.
>     // Instead, we should just compute and send post-layout editor state during the next frame.

It was added by:
Bug 193070 – REGRESSION (r239441): [iOS] Selection UI sometimes doesn't change after tapping "select all" in the callout bar