Index: components/exo/wayland/server.cc |
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc |
index 36d00c9b04489223c5736a67b47736df93b0ffe0..ecd4bcd24f94a9fef8d0b82eca18de809b15b546 100644 |
--- a/components/exo/wayland/server.cc |
+++ b/components/exo/wayland/server.cc |
@@ -7,6 +7,7 @@ |
#include <grp.h> |
#include <linux/input.h> |
#include <scaler-server-protocol.h> |
+#include <secure-output-unstable-v1-server-protocol.h> |
#include <stddef.h> |
#include <stdint.h> |
#include <wayland-server-core.h> |
@@ -103,6 +104,10 @@ DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); |
// with window. |
DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false); |
+// A property key containing a boolean set to true if a security object is |
+// associated with window. |
+DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasSecurityKey, false); |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// wl_buffer_interface: |
@@ -1875,10 +1880,6 @@ void scaler_get_viewport(wl_client* client, |
wl_resource* viewport_resource = wl_resource_create( |
client, &wl_viewport_interface, wl_resource_get_version(resource), id); |
- if (!viewport_resource) { |
- wl_resource_post_no_memory(resource); |
- return; |
- } |
SetImplementation(viewport_resource, &viewport_implementation, |
make_scoped_ptr(new Viewport(surface))); |
@@ -1892,11 +1893,93 @@ const uint32_t scaler_version = 2; |
void bind_scaler(wl_client* client, void* data, uint32_t version, uint32_t id) { |
wl_resource* resource = wl_resource_create( |
client, &wl_scaler_interface, std::min(version, scaler_version), id); |
- if (!resource) { |
- wl_client_post_no_memory(client); |
+ |
+ wl_resource_set_implementation(resource, &scaler_implementation, data, |
+ nullptr); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// security_interface: |
+ |
+class Security : public SurfaceObserver { |
+ public: |
+ explicit Security(Surface* surface) : surface_(surface) { |
+ surface_->AddSurfaceObserver(this); |
+ surface_->SetProperty(kSurfaceHasSecurityKey, true); |
+ } |
+ ~Security() override { |
+ if (surface_) { |
+ surface_->RemoveSurfaceObserver(this); |
+ surface_->SetOnlyVisibleOnSecureOutput(false); |
+ surface_->SetProperty(kSurfaceHasSecurityKey, false); |
+ } |
+ } |
+ |
+ void OnlyVisibleOnSecureOutput() { |
+ if (surface_) |
+ surface_->SetOnlyVisibleOnSecureOutput(true); |
+ } |
+ |
+ // Overridden from SurfaceObserver: |
+ void OnSurfaceDestroying(Surface* surface) override { |
+ surface->RemoveSurfaceObserver(this); |
+ surface_ = nullptr; |
+ } |
+ |
+ private: |
+ Surface* surface_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Security); |
+}; |
+ |
+void security_destroy(wl_client* client, wl_resource* resource) { |
+ wl_resource_destroy(resource); |
+} |
+ |
+void security_only_visible_on_secure_output(wl_client* client, |
+ wl_resource* resource) { |
+ GetUserDataAs<Security>(resource)->OnlyVisibleOnSecureOutput(); |
+} |
+ |
+const struct zwp_security_v1_interface security_implementation = { |
+ security_destroy, security_only_visible_on_secure_output}; |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// secure_output_interface: |
+ |
+void secure_output_destroy(wl_client* client, wl_resource* resource) { |
+ wl_resource_destroy(resource); |
+} |
+ |
+void secure_output_get_security(wl_client* client, |
+ wl_resource* resource, |
+ uint32_t id, |
+ wl_resource* surface_resource) { |
+ Surface* surface = GetUserDataAs<Surface>(surface_resource); |
+ if (surface->GetProperty(kSurfaceHasSecurityKey)) { |
+ wl_resource_post_error(resource, ZWP_SECURE_OUTPUT_V1_ERROR_SECURITY_EXISTS, |
+ "a security object for that surface already exists"); |
return; |
} |
- wl_resource_set_implementation(resource, &scaler_implementation, data, |
+ |
+ wl_resource* security_resource = |
+ wl_resource_create(client, &zwp_security_v1_interface, 1, id); |
+ |
+ SetImplementation(security_resource, &security_implementation, |
+ make_scoped_ptr(new Security(surface))); |
+} |
+ |
+const struct zwp_secure_output_v1_interface secure_output_implementation = { |
+ secure_output_destroy, secure_output_get_security}; |
+ |
+void bind_secure_output(wl_client* client, |
+ void* data, |
+ uint32_t version, |
+ uint32_t id) { |
+ wl_resource* resource = |
+ wl_resource_create(client, &zwp_secure_output_v1_interface, 1, id); |
+ |
+ wl_resource_set_implementation(resource, &secure_output_implementation, data, |
nullptr); |
} |
@@ -1930,6 +2013,8 @@ Server::Server(Display* display) |
display_, bind_seat); |
wl_global_create(wl_display_.get(), &wl_scaler_interface, scaler_version, |
display_, bind_scaler); |
+ wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, |
+ display_, bind_secure_output); |
} |
Server::~Server() {} |