summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-10-16 15:53:32 +0100
committerCaolán McNamara <caolanm@redhat.com>2015-10-16 17:16:51 +0100
commit6a627d6c5a94dbfae38bc1a6b1f716df19e47fd1 (patch)
tree995e0e4355b9c633232d14a0c416627ea2b2203d /vcl
parent9f5ab26bdada54898cac79e3c524664926de66b5 (diff)
afl-eventtesting: tweak key event injection
lowest idles have a minimum time out associated with them. So just post events and use higher idle time priority as launcher for min-wait-for-opportune time to start inserting Change-Id: I8088e142199e880b198da11473558b4bd972a8d9
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/svdata.hxx1
-rw-r--r--vcl/source/app/svapp.cxx51
2 files changed, 35 insertions, 17 deletions
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index 0559cd896ca1..0c850c03f9c8 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -163,6 +163,7 @@ struct ImplSVAppData
DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplQuitMsg, void*, void);
DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplEndAllDialogsMsg, void*, void);
+ DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplVclEventTestingHdl, void*, void);
DECL_LINK_TYPED(VclEventTestingHdl, Idle*, void);
};
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 1d924699a9e6..14b34c2ada48 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -347,9 +347,6 @@ namespace
{
bool InjectKeyEvent(SvStream& rStream)
{
- if (Application::AnyInput())
- return false;
-
VclPtr<vcl::Window> xWin(Application::GetFirstTopLevelWindow());
while (xWin)
{
@@ -360,6 +357,17 @@ namespace
if (!xWin)
return false;
+ // skip the first available cycle and insert on the next one when we
+ // are trying the initial event, flagged by a triggered but undeleted
+ // mpEventTestingIdle
+ ImplSVData* pSVData = ImplGetSVData();
+ if (pSVData->maAppData.mpEventTestingIdle)
+ {
+ delete pSVData->maAppData.mpEventTestingIdle;
+ pSVData->maAppData.mpEventTestingIdle = nullptr;
+ return false;
+ }
+
SalKeyEvent aKeyEvent;
aKeyEvent.mnTime = 0;
rStream.ReadUInt16(aKeyEvent.mnCode);
@@ -375,7 +383,6 @@ namespace
void CloseDialogsAndQuit()
{
- Scheduler::ProcessTaskScheduling(false);
Application::EndAllDialogs();
Application::Quit();
}
@@ -383,26 +390,36 @@ namespace
IMPL_LINK_NOARG_TYPED(ImplSVAppData, VclEventTestingHdl, Idle *, void)
{
- SAL_INFO("vcl.eventtesting", "EventTestLimit is " << mnEventTestLimit);
- if (mnEventTestLimit == 0)
+ if (Application::AnyInput())
{
- delete mpEventTestInput;
- delete mpEventTestingIdle;
- SAL_INFO("vcl.eventtesting", "Event Limit reached, exiting" << mnEventTestLimit);
+ mpEventTestingIdle->Start();
+ }
+ else
+ {
+ Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplVclEventTestingHdl ) );
+ }
+}
+
+IMPL_STATIC_LINK_NOARG_TYPED( ImplSVAppData, ImplVclEventTestingHdl, void*, void )
+{
+ ImplSVData* pSVData = ImplGetSVData();
+ SAL_INFO("vcl.eventtesting", "EventTestLimit is " << pSVData->maAppData.mnEventTestLimit);
+ if (pSVData->maAppData.mnEventTestLimit == 0)
+ {
+ delete pSVData->maAppData.mpEventTestInput;
+ SAL_INFO("vcl.eventtesting", "Event Limit reached, exiting" << pSVData->maAppData.mnEventTestLimit);
CloseDialogsAndQuit();
}
else
{
- Scheduler::ProcessTaskScheduling(false);
- if (InjectKeyEvent(*mpEventTestInput))
- --mnEventTestLimit;
- if (!mpEventTestInput->good())
+ if (InjectKeyEvent(*pSVData->maAppData.mpEventTestInput))
+ --pSVData->maAppData.mnEventTestLimit;
+ if (!pSVData->maAppData.mpEventTestInput->good())
{
SAL_INFO("vcl.eventtesting", "Event Input exhausted, exit next cycle");
- mnEventTestLimit = 0;
+ pSVData->maAppData.mnEventTestLimit = 0;
}
- Scheduler::ProcessTaskScheduling(false);
- mpEventTestingIdle->Start();
+ Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplVclEventTestingHdl ) );
}
}
@@ -420,7 +437,7 @@ void Application::Execute()
pSVData->maAppData.mnEventTestLimit = 10;
pSVData->maAppData.mpEventTestingIdle = new Idle("eventtesting");
pSVData->maAppData.mpEventTestingIdle->SetIdleHdl(LINK(&(pSVData->maAppData), ImplSVAppData, VclEventTestingHdl));
- pSVData->maAppData.mpEventTestingIdle->SetPriority(SchedulerPriority::LOWEST);
+ pSVData->maAppData.mpEventTestingIdle->SetPriority(SchedulerPriority::MEDIUM);
pSVData->maAppData.mpEventTestInput = new SvFileStream("eventtesting", StreamMode::READ);
pSVData->maAppData.mpEventTestingIdle->Start();
break;