[WK2] Perform layout for resize while JavaScript popup is displayed.
authorByungwoo Lee <bw80.lee@samsung.com>
Fri, 31 Aug 2012 08:04:07 +0000 (17:04 +0900)
committerByungwoo Lee <bw80.lee@samsung.com>
Fri, 31 Aug 2012 08:04:07 +0000 (17:04 +0900)
Without this patch, Main thread of WebProcess will be suspended when
JavaScript popup is displayed, and most of the IPC messages from UI
Process will be kept for dispatching after the popup is closed.

But this makes some display error when rotation happens or ime window
is closed during the JavaScript popup is displayed, because the resize
event from UIProcess will not be processed until the popup is closed.

With this patch, 'DispatchMessageEvenWhenWaitingForSyncReply' flag is
set to the IPC Messages during a JavaScript popup is displayed, and
those messages will be dispatched even the WebProcess is waiting for
the sync reply of javascript popup.

[Title] [WK2] Perform layout for resize while JavaScript popup is displayed.
[Issue #] N_SE-4573, N_SE-6904
[Problem] Cannot handle ipc messages for resize event during a
          javascript popup is displayed.
[Cause] Not implemented.
[Solution] set 'DispatchMessageEvenWhenWaitingForSyncReply' flag to
           the IPC Messages to be dispatched event the WebProcess is
           waiting for the sync reply.
[Developer] bw80.lee

Source/WebKit2/Platform/CoreIPC/Connection.cpp
Source/WebKit2/Platform/CoreIPC/Connection.h
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
Source/WebKit2/WebProcess/WebPage/efl/LayerTreeHostEfl.cpp
Source/WebKit2/WebProcess/WebPage/efl/LayerTreeHostEfl.h
Source/WebKit2/WebProcess/WebProcess.cpp
Source/WebKit2/WebProcess/WebProcess.h
Source/cmake/OptionsTizen.cmake
Source/cmakeconfig.h.cmake

index a3aa88c..734cc77 100644 (file)
@@ -63,6 +63,42 @@ public:
 
     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*);
 
@@ -94,6 +130,9 @@ private:
         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)
@@ -112,6 +151,18 @@ PassRefPtr<Connection::SyncMessageState> Connection::SyncMessageState::getOrCrea
     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)
@@ -178,6 +229,9 @@ void Connection::SyncMessageState::dispatchMessageAndResetDidScheduleDispatchMes
     }
 
     dispatchMessages();
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    dispatchWorkItems();
+#endif
 }
 
 PassRefPtr<Connection> Connection::createServerConnection(Identifier identifier, Client* client, RunLoop* clientRunLoop)
@@ -206,6 +260,9 @@ Connection::Connection(Identifier identifier, bool isServer, Client* client, Run
     , 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);
 
@@ -291,6 +348,25 @@ void Connection::setDefaultSyncMessageTimeout(double defaultSyncMessageTimeout)
     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);
@@ -307,6 +383,11 @@ bool Connection::sendMessage(MessageID messageID, PassOwnPtr<ArgumentEncoder> ar
     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))
@@ -440,6 +521,9 @@ PassOwnPtr<ArgumentDecoder> Connection::waitForSyncReply(uint64_t syncRequestID,
     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);
index 3541b0a..1ec49ca 100644 (file)
@@ -80,6 +80,21 @@ while (0)
 
 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;
@@ -150,6 +165,13 @@ public:
 
     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;
@@ -214,6 +236,10 @@ private:
     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);
     
@@ -265,6 +291,11 @@ private:
 
     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;
index 8dd1048..fd6b7fc 100755 (executable)
@@ -2478,6 +2478,9 @@ void WebPageProxy::runJavaScriptAlert(uint64_t frameID, const String& message, P
     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();
 }
@@ -2491,6 +2494,9 @@ void WebPageProxy::runJavaScriptConfirm(uint64_t frameID, const String& message,
     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);
 }
@@ -2504,6 +2510,9 @@ void WebPageProxy::runJavaScriptPrompt(uint64_t frameID, const String& message,
     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());
 }
index 8f5f3eb..273bdb6 100755 (executable)
@@ -676,6 +676,9 @@ void WebPageProxy::replyJavaScriptAlert()
 
     m_alertReply->send();
     m_alertReply = nullptr;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(false);
+#endif
 }
 
 void WebPageProxy::replyJavaScriptConfirm(bool result)
@@ -685,6 +688,9 @@ 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)
@@ -694,6 +700,9 @@ 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)
index fd18777..98d95a4 100644 (file)
@@ -418,6 +418,9 @@ void WebChromeClient::runJavaScriptAlert(Frame* frame, const String& alertText)
     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);
 }
 
@@ -430,6 +433,9 @@ bool WebChromeClient::runJavaScriptConfirm(Frame* frame, const String& message)
 
     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;
 
@@ -444,6 +450,9 @@ bool WebChromeClient::runJavaScriptPrompt(Frame* frame, const String& message, c
     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;
 
index aaf7765..63198a5 100644 (file)
@@ -146,11 +146,20 @@ void LayerTreeHostEfl::scheduleLayerFlush()
 
     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)
@@ -403,6 +412,10 @@ void LayerTreeHostEfl::performScheduledLayerFlush()
 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()
@@ -573,6 +586,24 @@ void LayerTreeHostEfl::renderNextFrame()
         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;
index 4264ae9..98c9963 100755 (executable)
@@ -155,6 +155,10 @@ private:
     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)
index 1ce5b60..12e63dc 100644 (file)
@@ -124,6 +124,23 @@ static void startRandomCrashThreadIfRequested()
     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;
@@ -163,6 +180,9 @@ WebProcess::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.
index 4d3c214..fea8d3d 100644 (file)
@@ -185,6 +185,15 @@ public:
     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();
 
@@ -341,6 +350,9 @@ private:
     WebSoupRequestManager m_soupRequestManager;
 #endif
 
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    int m_isWaitingForJavaScriptPopupCount;
+#endif
 };
 
 } // namespace WebKit
index ccfb24d..5a8a09e 100755 (executable)
@@ -128,6 +128,7 @@ WEBKIT_OPTION_DEFINE(ENABLE_LEGACY_NOTIFICATIONS "legacy notification" ON)
 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()
index b0a2bf6..1025a31 100644 (file)
@@ -99,6 +99,7 @@
 #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