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,