Open Bug 718107 Opened 13 years ago Updated 2 years ago

Using the DOM fullscreen API detaches and reattaches the XBL binding of the element when entering and again when exiting fullscreen

Categories

(Core :: DOM: Core & HTML, defect, P3)

x86_64
Windows 7
defect

Tracking

()

People

(Reporter: jaws, Unassigned)

References

Details

Attachments

(1 file)

When applying the patch in bug 666306, an overlay play button should appear when a non-autoplay video is loaded. After the video has begun playing, the overlay play button shouldn't appear again. Entering fullscreen mode is causing the overlay play button to appear. I placed a dump statement in the init method of the video controls and the init method is called 22 times when entering then exiting DOM fullscreen. Expected behavior: The XBL binding shouldn't be changed when moving an element to DOM fullscreen.
Component: General → DOM: Core & HTML
QA Contact: general → general
Summary: Using the DOM fullscreen API resets the XBL binding of the target element > 20 times → Using the DOM fullscreen API reattaches the XBL binding of the target element > 20 times
I have tested this again and I only see the binding detach and reattach twice now, but this still is an issue that blocks bug 666306 since the state of the controls is lost. This is a smaller patch that dumps out to the console when the binding is being initialized to show that it is initialized two times when entering and two times when exiting fullscreen.
Summary: Using the DOM fullscreen API reattaches the XBL binding of the target element > 20 times → Using the DOM fullscreen API detaches and reattaches the XBL binding of the element twice when entering and twice when exiting fullscreen
(In reply to Jared Wein [:jaws] from comment #0) > I placed a dump statement in the init method of the video controls and the > init method is called 22 times when entering then exiting DOM fullscreen. I figured out today that the 22 occurrences was because there was 11 videos on the page I was testing with. This explains why I saw 22 before and then 2 recently. The binding is detached and reattached twice per video on the page, even though only one of the videos enters fullscreen. I will try to get some stacks and attach them to this bug.
If you have that dump statement in there you should just be able to break on nsGlobalWindow::Dump to get stacks.
(In reply to Timothy Nikkel (:tn) from comment #3) > If you have that dump statement in there you should just be able to break on > nsGlobalWindow::Dump to get stacks. Thank you! Here is the first stack: xul.dll!nsGlobalWindow::Dump(const nsAString_internal & aStr) Line 4518 C++ xul.dll!nsIDOMJSWindow_Dump(JSContext * cx, unsigned int argc, JS::Value * vp) Line 648 C++ mozjs.dll!js::CallJSNative(JSContext * cx, int (JSContext *, unsigned int, JS::Value *) * native, const js::CallArgs & args) Line 311 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 520 C++ mozjs.dll!js::Interpret(JSContext * cx, js::StackFrame * entryFrame, js::InterpMode interpMode) Line 2912 C++ mozjs.dll!js::RunScript(JSContext * cx, JSScript * script, js::StackFrame * fp) Line 475 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 538 C++ mozjs.dll!js::Invoke(JSContext * cx, js::InvokeArgsGuard & args, js::MaybeConstruct construct) Line 157 C++ mozjs.dll!js::Invoke(JSContext * cx, const JS::Value & thisv, const JS::Value & fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 570 C++ mozjs.dll!JS_CallFunctionValue(JSContext * cx, JSObject * obj, JS::Value fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 5449 C++ xul.dll!nsXBLProtoImplAnonymousMethod::Execute(nsIContent * aBoundElement) Line 365 C++ xul.dll!nsXBLPrototypeBinding::BindingAttached(nsIContent * aBoundElement) Line 521 C++ xul.dll!nsXBLBinding::ExecuteAttachedHandler() Line 950 C++ xul.dll!nsBindingManager::ProcessAttachedQueue(unsigned int aSkipSize) Line 1054 C++ xul.dll!PresShell::InitialReflow(int aWidth, int aHeight) Line 1977 C++ xul.dll!DocumentViewerImpl::InitPresentationStuff(bool aDoInitialReflow) Line 779 C++ xul.dll!DocumentViewerImpl::Show() Line 2042 C++ xul.dll!nsDocShell::SetVisibility(bool aVisibility) Line 4939 C++ xul.dll!nsFrameLoader::Show(int marginWidth, int marginHeight, int scrollbarPrefX, int scrollbarPrefY, nsSubDocumentFrame * frame) Line 825 C++ xul.dll!nsSubDocumentFrame::ShowViewer() Line 231 C++ xul.dll!AsyncFrameInit::Run() Line 150 C++ xul.dll!nsContentUtils::RemoveScriptBlocker() Line 4457 C++ xul.dll!nsAutoScriptBlocker::~nsAutoScriptBlocker() Line 2030 C++ xul.dll!PresShell::FlushPendingNotifications(mozFlushType aType) Line 4048 C++ xul.dll!nsDocument::FlushPendingNotifications(mozFlushType aType) Line 6288 C++ xul.dll!nsGenericElement::GetPrimaryFrame(mozFlushType aType) Line 3776 C++ xul.dll!nsGenericElement::GetBoundingClientRect(nsIDOMClientRect * * aResult) Line 2126 C++ xul.dll!nsXULElement::GetBoundingClientRect(nsIDOMClientRect * * _retval) Line 541 C++ xul.dll!nsIDOMElement_GetBoundingClientRect(JSContext * cx, unsigned int argc, JS::Value * vp) Line 4383 C++ mozjs.dll!js::CallJSNative(JSContext * cx, int (JSContext *, unsigned int, JS::Value *) * native, const js::CallArgs & args) Line 311 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 520 C++ mozjs.dll!js::Interpret(JSContext * cx, js::StackFrame * entryFrame, js::InterpMode interpMode) Line 2912 C++ mozjs.dll!js::RunScript(JSContext * cx, JSScript * script, js::StackFrame * fp) Line 475 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 538 C++ mozjs.dll!js::Invoke(JSContext * cx, js::InvokeArgsGuard & args, js::MaybeConstruct construct) Line 157 C++ mozjs.dll!js::Invoke(JSContext * cx, const JS::Value & thisv, const JS::Value & fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 570 C++ mozjs.dll!JS_CallFunctionValue(JSContext * cx, JSObject * obj, JS::Value fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 5449 C++ xul.dll!nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS * wrapper, unsigned short methodIndex, const XPTMethodDescriptor * info, nsXPTCMiniVariant * nativeParams) Line 1513 C++ xul.dll!nsXPCWrappedJS::CallMethod(unsigned short methodIndex, const XPTMethodDescriptor * info, nsXPTCMiniVariant * params) Line 612 C++ xul.dll!PrepareAndDispatch(nsXPTCStubBase * self, unsigned int methodIndex, unsigned int * args, unsigned int * stackBytesToPop) Line 117 C++ xul.dll!SharedStub() Line 145 C++ xul.dll!nsEventListenerManager::HandleEventSubType(nsListenerStruct * aListenerStruct, nsIDOMEventListener * aListener, nsIDOMEvent * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aPhaseFlags, nsCxPusher * aPusher) Line 734 C++ xul.dll!nsEventListenerManager::HandleEventInternal(nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aFlags, nsEventStatus * aEventStatus, nsCxPusher * aPusher) Line 793 C++ xul.dll!nsEventListenerManager::HandleEvent(nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aFlags, nsEventStatus * aEventStatus, nsCxPusher * aPusher) Line 169 C++ xul.dll!nsEventTargetChainItem::HandleEvent(nsEventChainPostVisitor & aVisitor, unsigned int aFlags, bool aMayHaveNewListenerManagers, nsCxPusher * aPusher) Line 216 C++ xul.dll!nsEventTargetChainItem::HandleEventTargetChain(nsEventChainPostVisitor & aVisitor, unsigned int aFlags, nsDispatchingCallback * aCallback, bool aMayHaveNewListenerManagers, nsCxPusher * aPusher) Line 349 C++ xul.dll!nsEventDispatcher::Dispatch(nsISupports * aTarget, nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * aDOMEvent, nsEventStatus * aEventStatus, nsDispatchingCallback * aCallback, nsCOMArray<nsIDOMEventTarget> * aTargets) Line 681 C++ xul.dll!nsEventDispatcher::DispatchDOMEvent(nsISupports * aTarget, nsEvent * aEvent, nsIDOMEvent * aDOMEvent, nsPresContext * aPresContext, nsEventStatus * aEventStatus) Line 744 C++ xul.dll!nsGlobalWindow::DispatchEvent(nsIDOMEvent * aEvent, bool * aRetVal) Line 7364 C++ xul.dll!nsGlobalWindow::DispatchEvent(nsIDOMEvent * aEvent, bool * aRetVal) Line 7347 C++ xul.dll!nsContentUtils::DispatchTrustedEvent(nsIDocument * aDoc, nsISupports * aTarget, const nsAString_internal & aEventName, bool aCanBubble, bool aCancelable, bool * aDefaultAction) Line 3093 C++ xul.dll!nsGlobalWindow::DispatchCustomEvent(const char * aEventName) Line 4328 C++ xul.dll!nsGlobalWindow::SetFullScreen(bool aFullScreen) Line 4447 C++ xul.dll!nsGlobalWindow::SetFullScreen(bool aFullScreen) Line 4432 C++ xul.dll!nsSetWindowFullScreen::Run() Line 8485 C++ xul.dll!nsContentUtils::AddScriptRunner(nsIRunnable * aRunnable) Line 4482 C++ xul.dll!SetWindowFullScreen(nsIDocument * aDoc, bool aValue) Line 8496 C++ xul.dll!nsDocument::RequestFullScreen(mozilla::dom::Element * aElement, bool aWasCallerChrome) Line 8930 C++ xul.dll!nsCallRequestFullScreen::Run() Line 8640 C++ xul.dll!nsThread::ProcessNextEvent(bool mayWait, bool * result) Line 657 C++ xul.dll!NS_ProcessNextEvent_P(nsIThread * thread, bool mayWait) Line 245 C++ xul.dll!mozilla::ipc::MessagePump::Run(base::MessagePump::Delegate * aDelegate) Line 110 C++ xul.dll!MessageLoop::RunInternal() Line 209 C++ xul.dll!MessageLoop::RunHandler() Line 202 C++ xul.dll!MessageLoop::Run() Line 176 C++ xul.dll!nsBaseAppShell::Run() Line 191 C++ xul.dll!nsAppShell::Run() Line 258 C++ xul.dll!nsAppStartup::Run() Line 220 C++ xul.dll!XRE_main(int argc, char * * argv, const nsXREAppData * aAppData) Line 3537 C++ firefox.exe!do_main(const char * exePath, int argc, char * * argv) Line 205 C++ firefox.exe!NS_internal_main(int argc, char * * argv) Line 295 C++ firefox.exe!wmain(int argc, wchar_t * * argv) Line 107 C++ firefox.exe!__tmainCRTStartup() Line 552 C firefox.exe!wmainCRTStartup() Line 371 C Here is the second stack: xul.dll!nsGlobalWindow::Dump(const nsAString_internal & aStr) Line 4518 C++ xul.dll!nsIDOMJSWindow_Dump(JSContext * cx, unsigned int argc, JS::Value * vp) Line 648 C++ mozjs.dll!js::CallJSNative(JSContext * cx, int (JSContext *, unsigned int, JS::Value *) * native, const js::CallArgs & args) Line 311 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 520 C++ mozjs.dll!js::Interpret(JSContext * cx, js::StackFrame * entryFrame, js::InterpMode interpMode) Line 2912 C++ mozjs.dll!js::RunScript(JSContext * cx, JSScript * script, js::StackFrame * fp) Line 475 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 538 C++ mozjs.dll!js::Invoke(JSContext * cx, js::InvokeArgsGuard & args, js::MaybeConstruct construct) Line 157 C++ mozjs.dll!js::Invoke(JSContext * cx, const JS::Value & thisv, const JS::Value & fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 570 C++ mozjs.dll!JS_CallFunctionValue(JSContext * cx, JSObject * obj, JS::Value fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 5449 C++ xul.dll!nsXBLProtoImplAnonymousMethod::Execute(nsIContent * aBoundElement) Line 365 C++ xul.dll!nsXBLPrototypeBinding::BindingAttached(nsIContent * aBoundElement) Line 521 C++ xul.dll!nsXBLBinding::ExecuteAttachedHandler() Line 950 C++ xul.dll!nsBindingManager::ProcessAttachedQueue(unsigned int aSkipSize) Line 1054 C++ xul.dll!PresShell::InitialReflow(int aWidth, int aHeight) Line 1977 C++ xul.dll!DocumentViewerImpl::InitPresentationStuff(bool aDoInitialReflow) Line 779 C++ xul.dll!DocumentViewerImpl::Show() Line 2042 C++ xul.dll!nsDocShell::SetVisibility(bool aVisibility) Line 4939 C++ xul.dll!nsFrameLoader::Show(int marginWidth, int marginHeight, int scrollbarPrefX, int scrollbarPrefY, nsSubDocumentFrame * frame) Line 825 C++ xul.dll!nsSubDocumentFrame::ShowViewer() Line 231 C++ xul.dll!AsyncFrameInit::Run() Line 150 C++ xul.dll!nsContentUtils::RemoveScriptBlocker() Line 4457 C++ xul.dll!nsAutoScriptBlocker::~nsAutoScriptBlocker() Line 2030 C++ xul.dll!PresShell::ResizeReflowIgnoreOverride(int aWidth, int aHeight) Line 2132 C++ xul.dll!PresShell::ResizeReflow(int aWidth, int aHeight) Line 2083 C++ xul.dll!nsViewManager::DoSetWindowDimensions(int aWidth, int aHeight) Line 245 C++ xul.dll!nsViewManager::SetWindowDimensions(int aWidth, int aHeight) Line 263 C++ xul.dll!nsViewManager::DispatchEvent(nsGUIEvent * aEvent, nsIView * aView, nsEventStatus * aStatus) Line 689 C++ xul.dll!AttachedHandleEvent(nsGUIEvent * aEvent) Line 191 C++ xul.dll!nsWindow::DispatchEvent(nsGUIEvent * event, nsEventStatus & aStatus) Line 3563 C++ xul.dll!nsWindow::DispatchWindowEvent(nsGUIEvent * event) Line 3590 C++ xul.dll!nsWindow::OnResize(nsIntRect & aWindowRect) Line 7468 C++ xul.dll!nsWindow::ResetLayout() Line 1985 C++ xul.dll!nsWindow::UpdateNonClientMargins(int aSizeMode, bool aReflowWindow) Line 2158 C++ xul.dll!nsWindow::MakeFullScreen(bool aFullScreen) Line 2743 C++ xul.dll!nsGlobalWindow::SetFullScreen(bool aFullScreen) Line 4468 C++ xul.dll!nsSetWindowFullScreen::Run() Line 8485 C++ xul.dll!nsContentUtils::AddScriptRunner(nsIRunnable * aRunnable) Line 4482 C++ xul.dll!SetWindowFullScreen(nsIDocument * aDoc, bool aValue) Line 8496 C++ xul.dll!nsDocument::RestorePreviousFullScreenState() Line 8616 C++ xul.dll!nsDocument::MozCancelFullScreen() Line 8467 C++ xul.dll!NS_InvokeByIndex_P(nsISupports * that, unsigned int methodIndex, unsigned int paramCount, nsXPTCVariant * params) Line 103 C++ xul.dll!CallMethodHelper::Invoke() Line 2899 C++ xul.dll!CallMethodHelper::Call() Line 2230 C++ xul.dll!XPCWrappedNative::CallMethod(XPCCallContext & ccx, XPCWrappedNative::CallMode mode) Line 2196 C++ xul.dll!XPC_WN_CallMethod(JSContext * cx, unsigned int argc, JS::Value * vp) Line 1539 C++ mozjs.dll!js::CallJSNative(JSContext * cx, int (JSContext *, unsigned int, JS::Value *) * native, const js::CallArgs & args) Line 311 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 520 C++ mozjs.dll!js::Interpret(JSContext * cx, js::StackFrame * entryFrame, js::InterpMode interpMode) Line 2912 C++ mozjs.dll!js::RunScript(JSContext * cx, JSScript * script, js::StackFrame * fp) Line 475 C++ mozjs.dll!js::InvokeKernel(JSContext * cx, js::CallArgs args, js::MaybeConstruct construct) Line 538 C++ mozjs.dll!js::Invoke(JSContext * cx, js::InvokeArgsGuard & args, js::MaybeConstruct construct) Line 157 C++ mozjs.dll!js::Invoke(JSContext * cx, const JS::Value & thisv, const JS::Value & fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 570 C++ mozjs.dll!JS_CallFunctionValue(JSContext * cx, JSObject * obj, JS::Value fval, unsigned int argc, JS::Value * argv, JS::Value * rval) Line 5449 C++ xul.dll!nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS * wrapper, unsigned short methodIndex, const XPTMethodDescriptor * info, nsXPTCMiniVariant * nativeParams) Line 1513 C++ xul.dll!nsXPCWrappedJS::CallMethod(unsigned short methodIndex, const XPTMethodDescriptor * info, nsXPTCMiniVariant * params) Line 612 C++ xul.dll!PrepareAndDispatch(nsXPTCStubBase * self, unsigned int methodIndex, unsigned int * args, unsigned int * stackBytesToPop) Line 117 C++ xul.dll!SharedStub() Line 145 C++ xul.dll!nsEventListenerManager::HandleEventSubType(nsListenerStruct * aListenerStruct, nsIDOMEventListener * aListener, nsIDOMEvent * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aPhaseFlags, nsCxPusher * aPusher) Line 734 C++ xul.dll!nsEventListenerManager::HandleEventInternal(nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aFlags, nsEventStatus * aEventStatus, nsCxPusher * aPusher) Line 793 C++ xul.dll!nsEventListenerManager::HandleEvent(nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * * aDOMEvent, nsIDOMEventTarget * aCurrentTarget, unsigned int aFlags, nsEventStatus * aEventStatus, nsCxPusher * aPusher) Line 169 C++ xul.dll!nsEventTargetChainItem::HandleEvent(nsEventChainPostVisitor & aVisitor, unsigned int aFlags, bool aMayHaveNewListenerManagers, nsCxPusher * aPusher) Line 216 C++ xul.dll!nsEventTargetChainItem::HandleEventTargetChain(nsEventChainPostVisitor & aVisitor, unsigned int aFlags, nsDispatchingCallback * aCallback, bool aMayHaveNewListenerManagers, nsCxPusher * aPusher) Line 320 C++ xul.dll!nsEventDispatcher::Dispatch(nsISupports * aTarget, nsPresContext * aPresContext, nsEvent * aEvent, nsIDOMEvent * aDOMEvent, nsEventStatus * aEventStatus, nsDispatchingCallback * aCallback, nsCOMArray<nsIDOMEventTarget> * aTargets) Line 681 C++ xul.dll!nsEventDispatcher::DispatchDOMEvent(nsISupports * aTarget, nsEvent * aEvent, nsIDOMEvent * aDOMEvent, nsPresContext * aPresContext, nsEventStatus * aEventStatus) Line 744 C++ xul.dll!nsINode::DispatchEvent(nsIDOMEvent * aEvent, bool * aRetVal) Line 1171 C++ xul.dll!nsContentUtils::DispatchTrustedEvent(nsIDocument * aDoc, nsISupports * aTarget, const nsAString_internal & aEventName, bool aCanBubble, bool aCancelable, bool * aDefaultAction) Line 3093 C++ xul.dll!nsAsyncDOMEvent::Run() Line 78 C++ xul.dll!nsThread::ProcessNextEvent(bool mayWait, bool * result) Line 657 C++ xul.dll!NS_ProcessNextEvent_P(nsIThread * thread, bool mayWait) Line 245 C++ xul.dll!mozilla::ipc::MessagePump::Run(base::MessagePump::Delegate * aDelegate) Line 110 C++ xul.dll!MessageLoop::RunInternal() Line 209 C++ xul.dll!MessageLoop::RunHandler() Line 202 C++ xul.dll!MessageLoop::Run() Line 176 C++ xul.dll!nsBaseAppShell::Run() Line 191 C++ xul.dll!nsAppShell::Run() Line 258 C++ xul.dll!nsAppStartup::Run() Line 220 C++ xul.dll!XRE_main(int argc, char * * argv, const nsXREAppData * aAppData) Line 3537 C++ firefox.exe!do_main(const char * exePath, int argc, char * * argv) Line 205 C++ firefox.exe!NS_internal_main(int argc, char * * argv) Line 295 C++ firefox.exe!wmain(int argc, wchar_t * * argv) Line 107 C++ firefox.exe!__tmainCRTStartup() Line 552 C firefox.exe!wmainCRTStartup() Line 371 C
Looking at the stack and trying it out again, the first stack is from a request to enter fullscreen, and the second stack is to cancel fullscreen. I'm no longer seeing this happen twice per direction. This is still a bug though, as these bindings should not be reset when entering/exiting fullscreen.
The canceling of fullscreen is likely the result of the browser losing focus when the debugger hits the breakpoint: > 4001 // Exit DOM full-screen mode when the browser window loses focus (ALT+TAB, etc). > 4002 window.addEventListener("deactivate", this.exitDomFullScreen, true); https://mxr.mozilla.org/mozilla-central/source/browser/base/content/browser.js#4001
Summary: Using the DOM fullscreen API detaches and reattaches the XBL binding of the element twice when entering and twice when exiting fullscreen → Using the DOM fullscreen API detaches and reattaches the XBL binding of the element when entering and again when exiting fullscreen
From the first stack, > xul.dll!PresShell::InitialReflow(int aWidth, int aHeight) Line 1977 C++ InitialReflow fires the XBL binding constructors. Is it possible to enter fullscreen without hitting PresShell::InitialReflow? > 1977 NS_TIME_FUNCTION_MARK("XBL binding constructors fired"); http://mxr.mozilla.org/mozilla-central/source/layout/base/nsPresShell.cpp#1977
InitialReflow is called once when we create the initial basic layout objects for a document. I'm not sure why or what document we are creating when we enter fullscreen. Maybe its a recreate of the layout objects of an existing document.
No longer blocks: 666306
Blocks: 545812
No longer depends on: 545812
Is this still happening? We've since made us not reconstruct subdocuments when the element containing them in reconstructed.
(In reply to Timothy Nikkel (:tn) from comment #9) > Is this still happening? We've since made us not reconstruct subdocuments > when the element containing them in reconstructed. I applied the attached patch and still saw that the XBL constructor was being run when loading a webm video directly, again when entering fullscreen, and again when exiting fullscreen.
My work in bug 1444489 prompts me to investigate this again. Assuming this is not going to be fixed anytime soon, I will update videocontrols.xml under the assumption that it will *always* get recreated when we enter/leave fullscreen. Strangely, it doesn't seem to happen on touchControls, unless I tested it wrong....
Priority: -- → P3
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: