WebTileManager.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * Copyright (C) 2013 Sony Computer Entertainment Inc.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY SCE INC. AND ITS CONTRIBUTORS ``AS IS''
  14. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  15. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SCE INC. OR ITS CONTRIBUTORS
  17. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  18. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  19. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  21. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  22. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  23. * THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "config.h"
  26. #include "WebTileManager.h"
  27. #if ENABLE(MANX_HTMLTILE)
  28. #include "DOMWrapperWorld.h"
  29. #include "JSDOMWindow.h"
  30. #include "JSHTMLTile.h"
  31. #include "ScriptState.h"
  32. #include "ShareableBitmap.h"
  33. #include "UpdateInfo.h"
  34. #include "WebFrame.h"
  35. #include "WebPage.h"
  36. #include "WebProcess.h"
  37. #include "WebTile.h"
  38. #include "WebTileManagerMessages.h"
  39. #include "WebTileManagerProxyMessages.h"
  40. #include <WebCore/HTMLTile.h>
  41. using namespace WebCore;
  42. namespace WebKit {
  43. static uint64_t generateWebTileID()
  44. {
  45. static uint64_t uniqueWebTileID = 1;
  46. return uniqueWebTileID++;
  47. }
  48. WebTileManager::WebTileManager(WebPage* page)
  49. : m_webPage(page)
  50. {
  51. WebProcess::shared().addMessageReceiver(Messages::WebTileManager::messageReceiverName(), page->pageID(), this);
  52. }
  53. WebTileManager::~WebTileManager()
  54. {
  55. }
  56. bool WebTileManager::enableHTMLTileForFrame(WebFrame* frame, DOMWrapperWorld* world)
  57. {
  58. if (frame->page() != m_webPage)
  59. return false;
  60. JSDOMWindow* window = toJSDOMWindow(frame->coreFrame(), world);
  61. ScriptState* exec = window->globalExec();
  62. window->putDirect(exec->vm(), JSC::Identifier(exec, "HTMLTile"), JSHTMLTile::getConstructor(exec, window));
  63. return true;
  64. }
  65. void WebTileManager::tileUpdated(uint64_t tileID, const UpdateInfo& updateInfo)
  66. {
  67. if (!m_tiles.contains(tileID)) {
  68. // We must still "consume" updateInfo.bitmapHandle to ensure the backing shared memory segment is released.
  69. // This happens automatically from ShareableBitmap::create():
  70. // - create() returns a PassRefPtr<ShareableBitmap> which is deleted right after.
  71. // - The PassRefPtr destructor derefs the ShareableBitmap object, which ends up deleted too since there was only one ref.
  72. // - The SharedMemory member gets deleted in turn, which is where the shared memory segment is released.
  73. ShareableBitmap::create(updateInfo.bitmapHandle);
  74. return;
  75. }
  76. m_tiles.get(tileID)->webTile->tileUpdated(updateInfo);
  77. m_tiles.get(tileID)->htmlTile->dispatchOnUpdateEvent(/*TODO updateInfo.updateRects*/);
  78. m_webPage->send(Messages::WebTileManagerProxy::DidUpdateWebTile(tileID), 0);
  79. }
  80. void WebTileManager::tileValid(uint64_t tileID)
  81. {
  82. if (!m_tiles.contains(tileID))
  83. return;
  84. m_tiles.get(tileID)->htmlTile->setValid();
  85. }
  86. void WebTileManager::tileUnresponsive(uint64_t tileID)
  87. {
  88. if (!m_tiles.contains(tileID))
  89. return;
  90. m_tiles.get(tileID)->htmlTile->dispatchOnUnresponsiveEvent();
  91. }
  92. void WebTileManager::tileCrashed(uint64_t tileID)
  93. {
  94. if (!m_tiles.contains(tileID))
  95. return;
  96. m_tiles.get(tileID)->htmlTile->dispatchOnCrashEvent();
  97. }
  98. void WebTileManager::loadCompleted(uint64_t tileID)
  99. {
  100. if (!m_tiles.contains(tileID))
  101. return;
  102. m_tiles.get(tileID)->htmlTile->dispatchOnLoadEvent();
  103. }
  104. void WebTileManager::loadFailed(uint64_t tileID, uint32_t errorCode)
  105. {
  106. if (!m_tiles.contains(tileID))
  107. return;
  108. // Note: errorCode() is a CurlCode, see curl.h for the list of values
  109. m_tiles.get(tileID)->htmlTile->dispatchOnErrorEvent(errorCode);
  110. }
  111. void WebTileManager::locationChangeRequested(uint64_t tileID, const String& url)
  112. {
  113. if (!m_tiles.contains(tileID))
  114. return;
  115. m_tiles.get(tileID)->htmlTile->dispatchOnLocationChangeEvent(url);
  116. }
  117. void WebTileManager::runJavaScriptResultCallback(uint64_t tileID, uint64_t callbackID, const String& result)
  118. {
  119. if (!m_tiles.contains(tileID))
  120. return;
  121. m_tiles.get(tileID)->htmlTile->dispatchEvalCallback(callbackID, result);
  122. }
  123. uint64_t WebTileManager::createTile(int width, int height, const unsigned char*& tileData, size_t& tileDataSize, HTMLTile* htmlTile)
  124. {
  125. uint64_t tileID = generateWebTileID();
  126. m_webPage->send(Messages::WebTileManagerProxy::CreateWebTile(tileID, width, height, m_webPage->pageID()), 0);
  127. ASSERT(!m_tiles.contains(tileID));
  128. OwnPtr<WebTile> newTile = WebTile::create(width, height, this);
  129. tileData = newTile->tileData();
  130. tileDataSize = newTile->tileDataSize();
  131. TileData* td = new TileData { newTile.release(), htmlTile };
  132. m_tiles.set(tileID, adoptPtr(td) );
  133. return tileID;
  134. }
  135. void WebTileManager::destroyTile(uint64_t tileID)
  136. {
  137. m_webPage->send(Messages::WebTileManagerProxy::DestroyWebTile(tileID), 0);
  138. ASSERT(m_tiles.contains(tileID));
  139. m_tiles.remove(tileID);
  140. }
  141. void WebTileManager::loadURL(uint64_t tileID, const String &url)
  142. {
  143. m_webPage->send(Messages::WebTileManagerProxy::DidChangeWebTileURL(tileID, url), 0);
  144. }
  145. void WebTileManager::sendEvent(uint64_t tileID, int eventType)
  146. {
  147. m_webPage->send(Messages::WebTileManagerProxy::SendWebTileEvent(tileID, eventType), 0);
  148. }
  149. void WebTileManager::pause(uint64_t tileID)
  150. {
  151. m_webPage->send(Messages::WebTileManagerProxy::PauseWebTile(tileID), 0);
  152. }
  153. void WebTileManager::resume(uint64_t tileID)
  154. {
  155. m_webPage->send(Messages::WebTileManagerProxy::ResumeWebTile(tileID), 0);
  156. }
  157. void WebTileManager::eval(uint64_t tileID, const String& jsScript, uint64_t callbackID)
  158. {
  159. m_webPage->send(Messages::WebTileManagerProxy::RunJavaScriptInWebTile(tileID, jsScript, callbackID), 0);
  160. }
  161. } // namespace WebKit
  162. #endif // ENABLE(MANX_HTMLTILE)