EDK: Remove Core::GetDispatcher().

R=azani@chromium.org

Review URL: https://codereview.chromium.org/1957713003 .
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
index ac25362..3724de1 100644
--- a/mojo/edk/embedder/embedder.cc
+++ b/mojo/edk/embedder/embedder.cc
@@ -73,17 +73,20 @@
   DCHECK(platform_handle);
 
   DCHECK(internal::g_core);
-  RefPtr<system::Dispatcher> dispatcher;
-  MojoResult result = internal::g_core->GetDispatcher(
-      platform_handle_wrapper_handle, &dispatcher);
+  system::Handle h;
+  MojoResult result =
+      internal::g_core->GetHandle(platform_handle_wrapper_handle, &h);
   if (result != MOJO_RESULT_OK)
     return result;
 
-  if (dispatcher->GetType() != system::Dispatcher::Type::PLATFORM_HANDLE)
+  if (h.dispatcher->GetType() != system::Dispatcher::Type::PLATFORM_HANDLE)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
+  if (!h.has_all_rights(MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE))
+    return MOJO_RESULT_PERMISSION_DENIED;
+
   *platform_handle =
-      static_cast<system::PlatformHandleDispatcher*>(dispatcher.get())
+      static_cast<system::PlatformHandleDispatcher*>(h.dispatcher.get())
           ->PassPlatformHandle();
   return MOJO_RESULT_OK;
 }
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc
index 59bd543..a3a2bcf 100644
--- a/mojo/edk/system/core.cc
+++ b/mojo/edk/system/core.cc
@@ -105,15 +105,6 @@
   return handle_table_.GetHandle(handle, h);
 }
 
-MojoResult Core::GetDispatcher(MojoHandle handle,
-                               RefPtr<Dispatcher>* dispatcher) {
-  Handle h;
-  MojoResult result = GetHandle(handle, &h);
-  if (result == MOJO_RESULT_OK)
-    *dispatcher = std::move(h.dispatcher);
-  return result;
-}
-
 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle,
                                         RefPtr<Dispatcher>* dispatcher) {
   if (handle == MOJO_HANDLE_INVALID)
@@ -140,7 +131,7 @@
   if (result != MOJO_RESULT_OK)
     return result;
 
-  if ((h.rights & required_handle_rights) != required_handle_rights) {
+  if (!h.has_all_rights(required_handle_rights)) {
     return h.dispatcher->SupportsEntrypointClass(entrypoint_class)
                ? MOJO_RESULT_PERMISSION_DENIED
                : MOJO_RESULT_INVALID_ARGUMENT;
@@ -624,7 +615,7 @@
   if (result != MOJO_RESULT_OK)
     return result;
 
-  if (!(h.rights & MOJO_HANDLE_RIGHT_DUPLICATE)) {
+  if (!h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE)) {
     return h.dispatcher->SupportsEntrypointClass(EntrypointClass::BUFFER)
                ? MOJO_RESULT_PERMISSION_DENIED
                : MOJO_RESULT_INVALID_ARGUMENT;
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
index fbb289c..05504fd 100644
--- a/mojo/edk/system/core.h
+++ b/mojo/edk/system/core.h
@@ -62,9 +62,6 @@
   // handle value is invalid or |MOJO_RESULT_BUSY| if the handle is marked as
   // busy.
   MojoResult GetHandle(MojoHandle handle, Handle* h);
-  // TODO(vtl): Remove this.
-  MojoResult GetDispatcher(MojoHandle handle,
-                           util::RefPtr<Dispatcher>* dispatcher);
 
   // TODO(vtl): Convert this to |GetAndRemoveHandle()|.
   // Like |GetDispatcher()|, but on success also removes the handle from the
diff --git a/mojo/edk/system/handle.h b/mojo/edk/system/handle.h
index c02fa1d..1a01c36 100644
--- a/mojo/edk/system/handle.h
+++ b/mojo/edk/system/handle.h
@@ -48,6 +48,10 @@
 
   void reset() { *this = Handle(); }
 
+  bool has_all_rights(MojoHandleRights required_rights) const {
+    return (rights & required_rights) == required_rights;
+  }
+
   // Note: |dispatcher| is guaranteed to be null if default-constructed or
   // moved-from, but we make no guarantees about the value of |rights| in either
   // case.
diff --git a/mojo/edk/system/handle_unittest.cc b/mojo/edk/system/handle_unittest.cc
index 5183c9c..141b390 100644
--- a/mojo/edk/system/handle_unittest.cc
+++ b/mojo/edk/system/handle_unittest.cc
@@ -114,6 +114,37 @@
   }
 }
 
+TEST(HandleTest, HasAllRights) {
+  {
+    Handle h;
+
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_TRANSFER));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_READ));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_WRITE));
+  }
+
+  {
+    Handle h(MakeRefCounted<test::MockSimpleDispatcher>(),
+             MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_READ);
+
+    EXPECT_TRUE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_TRANSFER));
+    EXPECT_TRUE(h.has_all_rights(MOJO_HANDLE_RIGHT_READ));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_WRITE));
+
+    EXPECT_TRUE(
+        h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_READ));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE |
+                                  MOJO_HANDLE_RIGHT_READ |
+                                  MOJO_HANDLE_RIGHT_WRITE));
+    EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE |
+                                  MOJO_HANDLE_RIGHT_WRITE));
+
+    EXPECT_EQ(MOJO_RESULT_OK, h.dispatcher->Close());
+  }
+}
+
 }  // namespace
 }  // namespace system
 }  // namespace mojo