Allow using nullptr to hide the cursor

At https://crrev.com/c/2252342, handling of fallback cursors was moved
to CursorLoader. Fallbacks were created when the cursor factory returned
a null platform cursor, but that didn't take into account the usage of
null as the default value for kNone cursors, i.e. hidden cursors.

This CL changes CursorFactory::GetDefaultCursor() to return a
base::Optional<PlatformCursor> to differentiate between these two cases.

Fixed: 1099873
Change-Id: I70ad7b4c90658f6200489f4365404bb0c48e62da
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2274631
Reviewed-by: Avi Drissman <avi@chromium.org>
Commit-Queue: Henrique Ferreiro <hferreiro@igalia.com>
Cr-Commit-Position: refs/heads/master@{#785143}
diff --git a/ui/base/cursor/cursor_factory.cc b/ui/base/cursor/cursor_factory.cc
index c1b79564..43645a5 100644
--- a/ui/base/cursor/cursor_factory.cc
+++ b/ui/base/cursor/cursor_factory.cc
@@ -33,9 +33,10 @@
   return g_instance;
 }
 
-PlatformCursor CursorFactory::GetDefaultCursor(mojom::CursorType type) {
+base::Optional<PlatformCursor> CursorFactory::GetDefaultCursor(
+    mojom::CursorType type) {
   NOTIMPLEMENTED();
-  return 0;
+  return base::nullopt;
 }
 
 PlatformCursor CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
diff --git a/ui/base/cursor/cursor_factory.h b/ui/base/cursor/cursor_factory.h
index 1fff711..f038a42 100644
--- a/ui/base/cursor/cursor_factory.h
+++ b/ui/base/cursor/cursor_factory.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/component_export.h"
+#include "base/optional.h"
 #include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
 
 class SkBitmap;
@@ -30,7 +31,10 @@
   // Return the default cursor of the specified type. The types are listed in
   // ui/base/cursor/cursor.h. Default cursors are managed by the implementation
   // and must live indefinitely; there's no way to know when to free them.
-  virtual PlatformCursor GetDefaultCursor(mojom::CursorType type);
+  // nullptr may be a valid value for the hidden cursor. When a default cursor
+  // is not available, base::nullopt is returned.
+  virtual base::Optional<PlatformCursor> GetDefaultCursor(
+      mojom::CursorType type);
 
   // Return a image cursor from the specified image & hotspot. Image cursors
   // are referenced counted and have an initial refcount of 1. Therefore, each
diff --git a/ui/base/cursor/cursor_loader_ozone.cc b/ui/base/cursor/cursor_loader_ozone.cc
index 71b99fdf..6df16b5f 100644
--- a/ui/base/cursor/cursor_loader_ozone.cc
+++ b/ui/base/cursor/cursor_loader_ozone.cc
@@ -69,18 +69,20 @@
     return image_cursors_[type];
 
   // Check if there's a default platform cursor available.
-  PlatformCursor platform = factory_->GetDefaultCursor(type);
-  if (!platform) {
-    // Loads the default Aura cursor bitmap for the cursor type. Falls back on
-    // pointer cursor if this fails.
-    platform = CreateFallbackCursor(type);
-    if (!platform && type != mojom::CursorType::kPointer) {
-      platform = CursorFromType(mojom::CursorType::kPointer);
-      factory_->RefImageCursor(platform);
-      image_cursors_[type] = platform;
-    }
-    DCHECK(platform) << "Failed to load a fallback bitmap for cursor " << type;
+  base::Optional<PlatformCursor> default_cursor =
+      factory_->GetDefaultCursor(type);
+  if (default_cursor)
+    return *default_cursor;
+
+  // Loads the default Aura cursor bitmap for the cursor type. Falls back on
+  // pointer cursor if this fails.
+  PlatformCursor platform = CreateFallbackCursor(type);
+  if (!platform && type != mojom::CursorType::kPointer) {
+    platform = CursorFromType(mojom::CursorType::kPointer);
+    factory_->RefImageCursor(platform);
+    image_cursors_[type] = platform;
   }
+  DCHECK(platform) << "Failed to load a fallback bitmap for cursor " << type;
   return platform;
 }
 
diff --git a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
index 6cef39c..e86f70e 100644
--- a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
+++ b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
@@ -71,9 +71,11 @@
   return base::WrapRefCounted(ToBitmapCursorOzone(platform_cursor));
 }
 
-PlatformCursor BitmapCursorFactoryOzone::GetDefaultCursor(
+base::Optional<PlatformCursor> BitmapCursorFactoryOzone::GetDefaultCursor(
     mojom::CursorType type) {
-  return ToPlatformCursor(nullptr);
+  if (type == mojom::CursorType::kNone)
+    return nullptr;  // nullptr is used for the hidden cursor.
+  return base::nullopt;
 }
 
 PlatformCursor BitmapCursorFactoryOzone::CreateImageCursor(
diff --git a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
index c812fc90d..b489e09 100644
--- a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
+++ b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
@@ -62,7 +62,8 @@
       PlatformCursor platform_cursor);
 
   // CursorFactoryOzone:
-  PlatformCursor GetDefaultCursor(mojom::CursorType type) override;
+  base::Optional<PlatformCursor> GetDefaultCursor(
+      mojom::CursorType type) override;
   PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
                                    const gfx::Point& hotspot) override;
   PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
diff --git a/ui/base/x/x11_cursor_factory.cc b/ui/base/x/x11_cursor_factory.cc
index f706072..26624776 100644
--- a/ui/base/x/x11_cursor_factory.cc
+++ b/ui/base/x/x11_cursor_factory.cc
@@ -30,8 +30,12 @@
 
 X11CursorFactory::~X11CursorFactory() = default;
 
-PlatformCursor X11CursorFactory::GetDefaultCursor(mojom::CursorType type) {
-  return ToPlatformCursor(GetDefaultCursorInternal(type).get());
+base::Optional<PlatformCursor> X11CursorFactory::GetDefaultCursor(
+    mojom::CursorType type) {
+  auto cursor = GetDefaultCursorInternal(type);
+  if (!cursor)
+    return base::nullopt;
+  return ToPlatformCursor(cursor.get());
 }
 
 PlatformCursor X11CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
diff --git a/ui/base/x/x11_cursor_factory.h b/ui/base/x/x11_cursor_factory.h
index e741147..42451185 100644
--- a/ui/base/x/x11_cursor_factory.h
+++ b/ui/base/x/x11_cursor_factory.h
@@ -31,7 +31,8 @@
   ~X11CursorFactory() override;
 
   // CursorFactoryOzone:
-  PlatformCursor GetDefaultCursor(mojom::CursorType type) override;
+  base::Optional<PlatformCursor> GetDefaultCursor(
+      mojom::CursorType type) override;
   PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
                                    const gfx::Point& hotspot) override;
   PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,