Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1453)

Unified Diff: Source/modules/presentation/PresentationSession.cpp

Issue 1131463006: [PresentationAPI] Plumbing send(Blob) from PresentationSession IDL to platform/. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/presentation/PresentationSession.cpp
diff --git a/Source/modules/presentation/PresentationSession.cpp b/Source/modules/presentation/PresentationSession.cpp
index 6c6e9380d43916753372d614e9046f7806214c83..11990926b21c62cb47a0e00fcda6ef6a662f0840 100644
--- a/Source/modules/presentation/PresentationSession.cpp
+++ b/Source/modules/presentation/PresentationSession.cpp
@@ -11,6 +11,8 @@
#include "core/dom/ExceptionCode.h"
#include "core/events/Event.h"
#include "core/events/MessageEvent.h"
+#include "core/fileapi/FileReaderLoader.h"
+#include "core/fileapi/FileReaderLoaderClient.h"
#include "core/frame/LocalFrame.h"
#include "modules/EventTargetModules.h"
#include "modules/presentation/Presentation.h"
@@ -47,6 +49,43 @@ void throwPresentationDisconnectedError(ExceptionState& exceptionState)
} // namespace
+class PresentationSession::BlobLoader final : public GarbageCollectedFinalized<PresentationSession::BlobLoader>, public FileReaderLoaderClient {
+public:
+ BlobLoader(PassRefPtr<BlobDataHandle> blobDataHandle, PresentationSession* presentationSession)
+ : m_presentationSession(presentationSession)
+ , m_loader(FileReaderLoader::ReadAsArrayBuffer, this)
+ {
+ m_loader.start(m_presentationSession->executionContext(), blobDataHandle);
+ }
+ ~BlobLoader() override { }
+
+ // FileReaderLoaderClient functions.
+ void didStartLoading() override { }
+ void didReceiveData() override { }
+ void didFinishLoading() override
+ {
+ m_presentationSession->didFinishLoadingBlob(m_loader.arrayBufferResult());
+ }
+ void didFail(FileError::ErrorCode errorCode) override
+ {
+ m_presentationSession->didFailLoadingBlob(errorCode);
+ }
+
+ void cancel()
+ {
+ m_loader.cancel();
+ }
+
+ DEFINE_INLINE_TRACE()
+ {
+ visitor->trace(m_presentationSession);
+ }
+
+private:
+ Member<PresentationSession> m_presentationSession;
+ FileReaderLoader m_loader;
+};
+
PresentationSession::PresentationSession(LocalFrame* frame, const String& id, const String& url)
: DOMWindowProperty(frame)
, m_id(id)
@@ -57,6 +96,7 @@ PresentationSession::PresentationSession(LocalFrame* frame, const String& id, co
PresentationSession::~PresentationSession()
{
+ ASSERT(!m_blobLoader);
}
// static
@@ -90,6 +130,7 @@ ExecutionContext* PresentationSession::executionContext() const
DEFINE_TRACE(PresentationSession)
{
+ visitor->trace(m_blobLoader);
RefCountedGarbageCollectedEventTargetWithInlineData<PresentationSession>::trace(visitor);
DOMWindowProperty::trace(visitor);
}
@@ -136,6 +177,28 @@ void PresentationSession::sendInternal(const uint8_t* data, size_t size, Excepti
controller->send(m_url, m_id, data, size);
}
+void PresentationSession::send(Blob* data, ExceptionState& exceptionState)
+{
+ ASSERT(data);
+ if (m_state == WebPresentationSessionState::Disconnected) {
+ throwPresentationDisconnectedError(exceptionState);
+ return;
+ }
+
+ m_messages.append(adoptPtr(new Message(data->blobDataHandle())));
+ handleMessageQueue();
+}
+
+void PresentationSession::handleMessageQueue()
+{
+ if (m_messages.isEmpty() || m_blobLoader)
+ return;
+
+ Message* message = m_messages.first().get();
+ ASSERT(!m_blobLoader);
mark a. foltz 2015/05/26 20:41:48 I don't think this is necessary because of the ret
USE s.singapati at gmail.com 2015/05/27 19:37:51 Done.
+ m_blobLoader = new BlobLoader(message->blobDataHandle, this);
+}
+
void PresentationSession::didReceiveTextMessage(const String& message)
{
dispatchEvent(MessageEvent::create(message));
@@ -148,6 +211,16 @@ void PresentationSession::close()
PresentationController* controller = presentationController();
if (controller)
controller->closeSession(m_url, m_id);
+
+ // Cancel current Blob loading if any.
+ if (m_blobLoader) {
+ m_blobLoader->cancel();
+ m_blobLoader.clear();
+ }
+
+ // Clear Blob message queue.
+ Deque<OwnPtr<Message>> empty;
+ m_messages.swap(empty);
}
bool PresentationSession::matches(WebPresentationSessionClient* client) const
@@ -171,4 +244,28 @@ PresentationController* PresentationSession::presentationController()
return PresentationController::from(*frame());
}
+void PresentationSession::didFinishLoadingBlob(PassRefPtr<DOMArrayBuffer> buffer)
+{
+ ASSERT(!m_messages.isEmpty());
+ m_blobLoader.clear();
+ ASSERT(buffer && buffer->buffer());
+
+ PresentationController* controller = presentationController();
+ if (controller)
+ controller->sendBlobData(m_url, m_id, static_cast<const uint8_t*>(buffer->data()), buffer->byteLength());
+
+ m_messages.removeFirst();
+ handleMessageQueue();
+}
+
+void PresentationSession::didFailLoadingBlob(FileError::ErrorCode errorCode)
+{
+ ASSERT(!m_messages.isEmpty());
+ m_blobLoader.clear();
+ // FIXME: generate error message?
mark a. foltz 2015/05/26 20:41:48 There's currently no clean way to signal to the pa
+ // Ignore the current failed blob item and continue with next items.
+ m_messages.removeFirst();
+ handleMessageQueue();
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698