void dispatchMessages();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ PassRefPtr<WorkItem> dispatchWorkItem(const Function<void()>& function)
+ {
+ RefPtr<WorkItem> item;
+ {
+ MutexLocker locker(m_mutex);
+ item = adoptRef(new WorkItem(function));
+ m_workItemsToDispatchWhileWaitingForSyncReply.append(item);
+ }
+ wakeUpClientRunLoop();
+ return item;
+ }
+
+ void clearWorkItem(PassRefPtr<WorkItem> item)
+ {
+ MutexLocker locker(m_mutex);
+ if (!m_workItemsToDispatchWhileWaitingForSyncReply.contains(item))
+ return;
+ m_workItemsToDispatchWhileWaitingForSyncReply.remove(m_workItemsToDispatchWhileWaitingForSyncReply.find(item));
+ }
+
+ void dispatchWorkItems()
+ {
+ while (!m_workItemsToDispatchWhileWaitingForSyncReply.isEmpty()) {
+ Vector<RefPtr<WorkItem> > workItemsToDispatchWhileWaitingForSyncReply;
+ {
+ MutexLocker locker(m_mutex);
+ m_workItemsToDispatchWhileWaitingForSyncReply.swap(workItemsToDispatchWhileWaitingForSyncReply);
+ }
+
+ for (size_t i = 0; i < workItemsToDispatchWhileWaitingForSyncReply.size(); ++i)
+ workItemsToDispatchWhileWaitingForSyncReply[i]->dispatch();
+ }
+ }
+#endif
+
private:
explicit SyncMessageState(RunLoop*);
IncomingMessage incomingMessage;
};
Vector<ConnectionAndIncomingMessage> m_messagesToDispatchWhileWaitingForSyncReply;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ Vector<RefPtr<WorkItem> > m_workItemsToDispatchWhileWaitingForSyncReply;
+#endif
};
PassRefPtr<Connection::SyncMessageState> Connection::SyncMessageState::getOrCreate(RunLoop* runLoop)
return syncMessageState.release();
}
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+PassRefPtr<Connection::WorkItem> Connection::dispatchWorkItemWhileWaitingForSyncReply(const Function<void()>& function)
+{
+ return m_syncMessageState->dispatchWorkItem(function);
+}
+
+void Connection::clearWorkItemWhileWaitingForSyncReply(PassRefPtr<Connection::WorkItem> item)
+{
+ m_syncMessageState->clearWorkItem(item);
+}
+#endif
+
Connection::SyncMessageState::SyncMessageState(RunLoop* runLoop)
: m_runLoop(runLoop)
, m_didScheduleDispatchMessagesWork(false)
}
dispatchMessages();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ dispatchWorkItems();
+#endif
}
PassRefPtr<Connection> Connection::createServerConnection(Identifier identifier, Client* client, RunLoop* clientRunLoop)
, m_defaultSyncMessageTimeout(NoTimeout)
, m_syncMessageState(SyncMessageState::getOrCreate(clientRunLoop))
, m_shouldWaitForSyncReplies(true)
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ , m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount(0)
+#endif
{
ASSERT(m_client);
m_defaultSyncMessageTimeout = defaultSyncMessageTimeout;
}
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+void Connection::setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(bool flag)
+{
+ MutexLocker locker(m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCountLock);
+
+ if (flag)
+ ++m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount;
+ else if (m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount > 0)
+ --m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount;
+}
+
+bool Connection::forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply()
+{
+ MutexLocker locker(m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCountLock);
+
+ return m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount > 0;
+}
+#endif
+
PassOwnPtr<ArgumentEncoder> Connection::createSyncMessageArgumentEncoder(uint64_t destinationID, uint64_t& syncRequestID)
{
OwnPtr<ArgumentEncoder> argumentEncoder = ArgumentEncoder::create(destinationID);
if (!isValid())
return false;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ if (!(messageID == CoreIPCMessage::SyncMessageReply) && forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply())
+ messageSendFlags |= DispatchMessageEvenWhenWaitingForSyncReply;
+#endif
+
if (messageSendFlags & DispatchMessageEvenWhenWaitingForSyncReply
&& (!m_onlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage
|| m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount))
while (!timedOut) {
// First, check if we have any messages that we need to process.
m_syncMessageState->dispatchMessages();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ m_syncMessageState->dispatchWorkItems();
+#endif
{
MutexLocker locker(m_syncReplyStateMutex);
class Connection : public ThreadSafeRefCounted<Connection> {
public:
+
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ class WorkItem : public ThreadSafeRefCounted<WorkItem> {
+ public:
+ WorkItem(const Function<void()>& function)
+ : m_function(function)
+ {
+ }
+
+ void dispatch() { m_function(); }
+ private:
+ Function<void()> m_function;
+ };
+#endif
+
class MessageReceiver {
public:
virtual void didReceiveMessage(Connection*, MessageID, ArgumentDecoder*) = 0;
void setDefaultSyncMessageTimeout(double);
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ void setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(bool);
+
+ PassRefPtr<WorkItem> dispatchWorkItemWhileWaitingForSyncReply(const Function<void()>&);
+ void clearWorkItemWhileWaitingForSyncReply(PassRefPtr<Connection::WorkItem> item);
+#endif
+
void postConnectionDidCloseOnConnectionWorkQueue();
static const int DefaultTimeout = 0;
void platformInvalidate();
bool isValid() const { return m_client; }
+
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ bool forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply();
+#endif
PassOwnPtr<ArgumentDecoder> waitForMessage(MessageID, uint64_t destinationID, double timeout);
double m_defaultSyncMessageTimeout;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ Mutex m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCountLock;
+ int m_forcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReplyCount;
+#endif
+
// Incoming messages.
Mutex m_incomingMessagesLock;
Deque<IncomingMessage> m_incomingMessages;
process()->responsivenessTimer()->stop();
m_alertReply = reply;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(true);
+#endif
if (!m_uiClient.runJavaScriptAlert(this, message, frame))
replyJavaScriptAlert();
}
process()->responsivenessTimer()->stop();
m_confirmReply = reply;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(true);
+#endif
if (!m_uiClient.runJavaScriptConfirm(this, message, frame))
replyJavaScriptConfirm(false);
}
process()->responsivenessTimer()->stop();
m_promptReply = reply;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(true);
+#endif
if (!m_uiClient.runJavaScriptPrompt(this, message, defaultValue, frame))
replyJavaScriptPrompt(String());
}
m_alertReply->send();
m_alertReply = nullptr;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(false);
+#endif
}
void WebPageProxy::replyJavaScriptConfirm(bool result)
m_confirmReply->send(result);
m_confirmReply = nullptr;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(false);
+#endif
}
void WebPageProxy::replyJavaScriptPrompt(const String& result)
m_promptReply->send(result);
m_promptReply = nullptr;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(false);
+#endif
}
#if PLUGIN_ARCHITECTURE(X11)
m_page->injectedBundleUIClient().willRunJavaScriptAlert(m_page, alertText, webFrame);
unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ WebProcess::WaitForJavaScriptPopupFinished waiting;
+#endif
WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptAlert(webFrame->frameID(), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply(), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags);
}
unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
bool result = false;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ WebProcess::WaitForJavaScriptPopupFinished waiting;
+#endif
if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame->frameID(), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
return false;
m_page->injectedBundleUIClient().willRunJavaScriptPrompt(m_page, message, defaultValue, webFrame);
unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ WebProcess::WaitForJavaScriptPopupFinished waiting;
+#endif
if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame->frameID(), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
return false;
if (!m_layerFlushTimer.isActive())
m_layerFlushTimer.startOneShot(0.0);
+
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ if (!m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply)
+ m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply = m_webPage->connection()->dispatchWorkItemWhileWaitingForSyncReply(WTF::bind(&LayerTreeHostEfl::performScheduledLayerFlushForcely, this));
+#endif
}
void LayerTreeHostEfl::cancelPendingLayerFlush()
{
m_layerFlushTimer.stop();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ m_webPage->connection()->clearWorkItemWhileWaitingForSyncReply(m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply);
+ m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply.clear();
+#endif
}
void LayerTreeHostEfl::setShouldNotifyAfterNextScheduledLayerFlush(bool notifyAfterScheduledLayerFlush)
void LayerTreeHostEfl::layerFlushTimerFired(Timer<LayerTreeHostEfl>*)
{
performScheduledLayerFlush();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ m_webPage->connection()->clearWorkItemWhileWaitingForSyncReply(m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply);
+ m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply.clear();
+#endif
}
void LayerTreeHostEfl::createPageOverlayLayer()
m_updateAtlases[i].didSwapBuffers();
}
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+void LayerTreeHostEfl::performScheduledLayerFlushForcely()
+{
+ if (!WebProcess::shared().isWaitingForJavaScriptPopupFinished() && m_layerFlushTimer.isActive())
+ return;
+
+#if ENABLE(TIZEN_ONESHOT_DRAWING_SYNCHRONIZATION)
+ m_needsOneShotDrawingSynchronization = false;
+ m_needsSkipRenderNextFrame = false;
+#endif
+ m_waitingForUIProcess = false;
+
+ performScheduledLayerFlush();
+ m_layerFlushTimer.stop();
+ m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply.clear();
+}
+#endif
+
bool LayerTreeHostEfl::layerTreeTileUpdatesAllowed() const
{
return !m_isSuspended && !m_waitingForUIProcess;
bool m_shouldSyncRootLayer;
void layerFlushTimerFired(WebCore::Timer<LayerTreeHostEfl>*);
WebCore::Timer<LayerTreeHostEfl> m_layerFlushTimer;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ void performScheduledLayerFlushForcely();
+ RefPtr<CoreIPC::Connection::WorkItem> m_layerFlushWorkItemToDispatchWhileWaitingForSyncReply;
+#endif
bool m_layerFlushSchedulingEnabled;
#if ENABLE(TIZEN_WEBKIT2_TILED_AC)
createThread(randomCrashThread, 0, "WebKit2: Random Crash Thread");
}
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+WebProcess::WaitForJavaScriptPopupFinished::WaitForJavaScriptPopupFinished()
+{
+ ++WebProcess::shared().m_isWaitingForJavaScriptPopupCount;
+}
+
+WebProcess::WaitForJavaScriptPopupFinished::~WaitForJavaScriptPopupFinished()
+{
+ --WebProcess::shared().m_isWaitingForJavaScriptPopupCount;
+}
+
+bool WebProcess::isWaitingForJavaScriptPopupFinished()
+{
+ return m_isWaitingForJavaScriptPopupCount > 0;
+}
+#endif
+
WebProcess& WebProcess::shared()
{
static WebProcess& process = *new WebProcess;
#if USE(SOUP)
, m_soupRequestManager(this)
#endif
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ , m_isWaitingForJavaScriptPopupCount(0)
+#endif
{
#if USE(PLATFORM_STRATEGIES)
// Initialize our platform strategies.
const String& indexedDatabaseDirectory() const { return m_indexedDatabaseDirectory; }
#endif
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ class WaitForJavaScriptPopupFinished {
+ public:
+ WaitForJavaScriptPopupFinished();
+ ~WaitForJavaScriptPopupFinished();
+ };
+ bool isWaitingForJavaScriptPopupFinished();
+#endif
+
private:
WebProcess();
WebSoupRequestManager m_soupRequestManager;
#endif
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ int m_isWaitingForJavaScriptPopupCount;
+#endif
};
} // namespace WebKit
WEBKIT_OPTION_DEFINE(ENABLE_TIZEN_MM_PLAYER "Use Tizen Multimedia Framework for Tizen" OFF)
WEBKIT_OPTION_DEFINE(ENABLE_MEDIA_STREAM "Enable Media Stream" ON)
WEBKIT_OPTION_DEFINE(ENABLE_TIZEN_WEBKIT2_SPELLCHECKING "Enable spellchecking in WebKit 2" OFF)
+WEBKIT_OPTION_DEFINE(ENABLE_TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP "Enable rotation while showing javascript popup for WebKit 2" ON)
# END WEBKIT2
WEBKIT_OPTION_END()
#cmakedefine01 ENABLE_TIZEN_SUPPORT_WEBAPP_META_TAG
#cmakedefine01 ENABLE_TIZEN_WAC_CAMERA
#cmakedefine01 ENABLE_TIZEN_WEBKIT_EFL_DRT
+#cmakedefine01 ENABLE_TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP
#cmakedefine01 ENABLE_SCREEN_ORIENTATION_SUPPORT