Index: content/browser/android/scoped_surface_request_manager.h |
diff --git a/content/browser/android/scoped_surface_request_manager.h b/content/browser/android/scoped_surface_request_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aee96e95796f6a847e054cec425ff538a79aead1 |
--- /dev/null |
+++ b/content/browser/android/scoped_surface_request_manager.h |
@@ -0,0 +1,84 @@ |
+// Copyright 2016 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 CONTENT_BROWSER_ANDROID_SCOPED_SURFACE_REQUEST_MANAGER_H_ |
+#define CONTENT_BROWSER_ANDROID_SCOPED_SURFACE_REQUEST_MANAGER_H_ |
+ |
+#include <unordered_map> |
+ |
+#include "base/macros.h" |
+#include "base/memory/singleton.h" |
+#include "base/unguessable_token.h" |
+#include "content/common/content_export.h" |
+#include "gpu/ipc/common/android/scoped_surface_request_conduit.h" |
+#include "ui/gl/android/scoped_java_surface.h" |
+ |
+namespace content { |
+ |
+class CONTENT_EXPORT ScopedSurfaceRequestManager |
+ : public gpu::ScopedSurfaceRequestConduit { |
+ public: |
+ static ScopedSurfaceRequestManager* GetInstance(); |
+ |
+ using ScopedSurfaceRequestCB = base::Callback<void(gl::ScopedJavaSurface)>; |
+ |
+ // Registers a request, and returns the |request_token| that should be used to |
+ // call Fulfill at a later time. The caller is responsible for unregistering |
+ // the request, if it is destroyed before the request is fulfilled. |
+ // It is the requester's responsibility to check the validity of the final |
+ // ScopedJavaSurface (as passing an empty surface is a valid operation). |
+ // Must be called on the UI thread. |
+ base::UnguessableToken RegisterScopedSurfaceRequest( |
+ const ScopedSurfaceRequestCB& request_cb); |
+ |
+ // Unregisters a request registered under |request_token| if it exists, |
+ // no-ops otherwise. |
+ // Must be called on the UI thread. |
+ void UnregisterScopedSurfaceRequest( |
+ const base::UnguessableToken& request_token); |
+ |
+ // Unregisters and runs the request callback identified by |request_token| if |
+ // one exists, no-ops otherwise. |
+ // Passing an empty |surface| is a valid operation that will complete the |
+ // request. |
+ // Can be called from any thread. The request will be posted to the UI thread. |
+ void FulfillScopedSurfaceRequest(const base::UnguessableToken& request_token, |
+ gl::ScopedJavaSurface surface); |
+ |
+ // Implementation of ScopedSurfaceRequestConduit. |
+ // To be used in the single process case. |
+ // Can be called from any thread. |
+ void ForwardSurfaceTextureForSurfaceRequest( |
+ const base::UnguessableToken& request_token, |
+ const gl::SurfaceTexture* surface_texture) override; |
+ |
+ void clear_requests_for_testing() { request_callbacks_.clear(); } |
+ |
+ int request_count_for_testing() { return request_callbacks_.size(); } |
+ |
+ private: |
+ friend struct base::DefaultSingletonTraits<ScopedSurfaceRequestManager>; |
+ |
+ // Unregisters and returns the request identified by |request_token|. |
+ ScopedSurfaceRequestCB GetAndUnregisterInternal( |
+ const base::UnguessableToken& request_token); |
+ |
+ void CompleteRequestOnUiThread(const base::UnguessableToken& request_token, |
+ gl::ScopedJavaSurface surface); |
+ |
+ // Map used to hold references to the registered callbacks. |
+ std::unordered_map<base::UnguessableToken, |
+ ScopedSurfaceRequestCB, |
+ base::UnguessableTokenHash> |
+ request_callbacks_; |
+ |
+ ScopedSurfaceRequestManager(); |
+ ~ScopedSurfaceRequestManager() override; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedSurfaceRequestManager); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_ANDROID_SCOPED_SURFACE_REQUEST_MANAGER_H_ |