Cache Storage WPT: Update backend cache name type to std::u16string.

Currently, the cache name in Chromium does not correctly handle
DOMString (16-bit) values, particularly unpaired surrogates. These
characters should be preserved as-is instead of being replaced with a
<?> replacement character.

The issue originates after the cache name is sent through a Mojo message
and processed in the backend. Specifically, in
cache_storage_dispatcher_host.cc, the cache_name, which is received in
std::u16string format by the Open(), Has(), Match(), Keys(), and
Delete() APIs, is converted to UTF-8 format. This conversion leads to
the unintended replacement of unpaired surrogate characters.

This change ensures that the cache name is consistently handled as a
std::u16string throughout the system, preventing unintended character
replacements. However, it is important to note the following:

Mojo Message Conversion: While the cache name is stored and processed as
a std::u16string, it will still be converted to UTF-8 when sent over
Mojo. This behavior remains unchanged.

Read/Write Logic: When writing a cache entry, both UTF-8 and UTF-16
representations of the cache name are stored. When reading a cache
entry, we will first attempt to read the UTF-16 name. If it is
unavailable, we will fall back to reading the UTF-8 name for backward
compatibility with existing cache data.

By implementing this approach, we ensure proper handling of unpaired
surrogate sequences while maintaining backward compatibility with
previously stored cache names in UTF-8.

Bug: 41142654
Change-Id: I04787a410b6cab59b3b511534d7e9d1ec1c310cc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6170241
Commit-Queue: Sneha Agarwal <snehagarwal@microsoft.com>
Reviewed-by: Mingyu Lei <leimy@chromium.org>
Reviewed-by: Steve Becker <stevebe@microsoft.com>
Reviewed-by: Rahul Singh <rahsin@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1429711}
26 files changed
tree: 4cd9b373ccee890a498c54ee8814ec8f0c5b518c
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.