// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CompositeDataConsumerHandle_h #define CompositeDataConsumerHandle_h #include "modules/ModulesExport.h" #include "platform/heap/Handle.h" #include "public/platform/WebDataConsumerHandle.h" #include "wtf/Allocator.h" #include "wtf/OwnPtr.h" #include "wtf/PassOwnPtr.h" #include "wtf/RefPtr.h" namespace blink { class WebThread; // This is a utility class to construct a composite data consumer handle. It // owns a web data consumer handle and delegates methods. A user can update // the handle by using |update| method. class MODULES_EXPORT CompositeDataConsumerHandle final : public WebDataConsumerHandle { WTF_MAKE_NONCOPYABLE(CompositeDataConsumerHandle); USING_FAST_MALLOC(CompositeDataConsumerHandle); class Context; public: // An Updater is bound to the creator thread. class MODULES_EXPORT Updater final : public GarbageCollectedFinalized { public: explicit Updater(PassRefPtr); ~Updater(); // |handle| must not be null and must not be locked. void update(PassOwnPtr /* handle */); DEFINE_INLINE_TRACE() { } private: RefPtr m_context; #if ENABLE(ASSERT) WebThread* const m_thread; #endif }; // Returns a handle and stores the associated updater to |*updater|. The // associated updater will be bound to the calling thread. // |handle| must not be null and must not be locked. template static PassOwnPtr create(PassOwnPtr handle, T* updater) { ASSERT(handle); Updater* u = nullptr; auto p = adoptPtr(new CompositeDataConsumerHandle(handle, &u)); *updater = u; return p; } ~CompositeDataConsumerHandle() override; private: class ReaderImpl; Reader* obtainReaderInternal(Client*) override; const char* debugName() const override { return "CompositeDataConsumerHandle"; } CompositeDataConsumerHandle(PassOwnPtr, Updater**); RefPtr m_context; }; } // namespace blink #endif // CompositeDataConsumerHandle_h