Compare commits

..

13 Commits

Author SHA1 Message Date
trop[bot]
4d18062d0f ci: disallow non-maintainer changes to Yarn files (#49192)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
2025-12-11 17:14:14 -05:00
electron-roller[bot]
832ffb2330 chore: bump chromium to 142.0.7444.235 (39-x-y) (#49190)
chore: bump chromium in DEPS to 142.0.7444.235

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
2025-12-11 15:25:12 -05:00
trop[bot]
03121eeaef build: upgrade yarn to 4.12.0 (#49179)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <kleinschmidtorama@gmail.com>
2025-12-10 19:20:43 -08:00
trop[bot]
8282c07a0f build: upgrade github-app-auth to 3.2.0 (#49177)
build: upgrade github-app-auth to 3.2.0 (#49152)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2025-12-10 14:20:43 -05:00
Niklas Wenzel
f2d1cb21b0 fix: visual artifacts while resizing on Windows (#49138)
Manual backports of:

- crrev.com/c/7129658
- crrev.com/c/7210913
- crrev.com/c/7115438
2025-12-04 16:42:24 -08:00
electron-roller[bot]
ef9b4162af chore: bump chromium to 142.0.7444.226 (39-x-y) (#49137)
* chore: bump chromium in DEPS to 142.0.7444.226

* chore: update patches

---------

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Niklas Wenzel <dev@nikwen.de>
2025-12-03 15:50:16 -05:00
trop[bot]
6e97bca80d fix: run toast creation on background thread (#49130)
* fix: run toast creation on background thread

notes: attempts to fix app freeze when triggering notifications and the COM server in WindowsShellExperienceHost hangs

Co-authored-by: Jan Hannemann <jan.hannemann@outlook.com>

* fix: comments

Co-authored-by: Jan Hannemann <jan.hannemann@outlook.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Jan Hannemann <jan.hannemann@outlook.com>
2025-12-02 20:41:24 -08:00
trop[bot]
c511fc5c3f chore: reclaim macOS disk space (#49121)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2025-12-01 15:30:07 -08:00
trop[bot]
22dfbb0822 ci: use clang problem matcher with nan spec runner (#49099)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
2025-12-01 09:45:35 -05:00
trop[bot]
85913a38da fix: ensure menu-did-close is emitted for application menus (#49093)
fix: ensure menu-did-close is emitted for application menus

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
2025-11-26 11:47:13 -06:00
trop[bot]
a327629ca2 ci: don't build yarn modules for linux arm (#49088)
This should fix the oom errors

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2025-11-26 10:32:30 -05:00
Niklas Wenzel
7deed2b980 fix: reduce visual artifacts while resizing on Windows (#49076) 2025-11-26 10:23:52 +01:00
trop[bot]
65fc06a9f7 chore: backport 744f40f from devtools-frontend (#49044)
* chore: backport 744f40f from devtools-frontend

Co-authored-by: deepak1556 <hop2deep@gmail.com>

* chore: update patch

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: deepak1556 <hop2deep@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2025-11-25 12:07:04 -06:00
26 changed files with 1184 additions and 579 deletions

View File

@@ -64,15 +64,24 @@ runs:
sudo rm -rf /Applications/Xcode_16.1.app
sudo rm -rf /Applications/Xcode_16.2.app
sudo rm -rf /Applications/Xcode_16.3.app
sudo rm -rf /Applications/Xcode_26*
sudo rm -rf /Applications/Google Chrome.app
sudo rm -rf /Applications/Google Chrome for Testing.app
sudo rm -rf /Applications/Firefox.app
sudo rm -rf /Applications/Firefox.app
sudo rm -rf /Applications/Microsoft Edge.app
sudo rm -rf ~/project/src/third_party/catapult/tracing/test_data
sudo rm -rf ~/project/src/third_party/angle/third_party/VK-GL-CTS
sudo rm -rf /Users/runner/Library/Android
sudo rm -rf $JAVA_HOME_11_arm64
sudo rm -rf $JAVA_HOME_17_arm64
sudo rm -rf $JAVA_HOME_21_arm64
sudo rm -rf $JAVA_HOME_25_arm64
sudo rm -rf /Users/runner/.dotnet/
sudo rm -rf /Users/runner/.rustup
# remove homebrew packages we don't need
brew uninstall -f --zap aws-sam-cli session-manager-plugin gcc gcc@13 gcc@14 llvm@18 gradle maven ant azure-cli
brew autoremove
# lipo off some huge binaries arm64 versions to save space
strip_universal_deep $(xcode-select -p)/../SharedFrameworks

View File

@@ -21,4 +21,11 @@ runs:
if [ "$TARGET_ARCH" = "x86" ]; then
export npm_config_arch="ia32"
fi
node script/yarn.js install --immutable
# if running on linux arm skip yarn Builds
ARCH=$(uname -m)
if [ "$ARCH" = "armv7l" ]; then
echo "Skipping yarn build on linux arm"
node script/yarn.js install --immutable --mode=skip-build
else
node script/yarn.js install --immutable
fi

View File

@@ -7,6 +7,8 @@ on:
- 'spec/yarn.lock'
- '.github/workflows/**'
- '.github/actions/**'
- '.yarn/**'
- '.yarnrc.yml'
permissions: {}

View File

@@ -138,10 +138,16 @@ jobs:
unzip -:o dist.zip
- name: Setup Linux for Headless Testing
run: sh -e /etc/init.d/xvfb start
- name: Add Clang problem matcher
shell: bash
run: echo "::add-matcher::src/electron/.github/problem-matchers/clang.json"
- name: Run Nan Tests
run: |
cd src
node electron/script/nan-spec-runner.js
- name: Remove Clang problem matcher
shell: bash
run: echo "::remove-matcher owner=clang::"
- name: Wait for active SSH sessions
shell: bash
if: always() && !cancelled()

File diff suppressed because one or more lines are too long

View File

@@ -9,4 +9,4 @@ npmMinimalAgeGate: 10080
npmPreapprovedPackages:
- "@electron/*"
yarnPath: .yarn/releases/yarn-4.11.0.cjs
yarnPath: .yarn/releases/yarn-4.12.0.cjs

4
DEPS
View File

@@ -2,7 +2,7 @@ gclient_gn_args_from = 'src'
vars = {
'chromium_version':
'142.0.7444.177',
'142.0.7444.235',
'node_version':
'v22.21.1',
'nan_version':
@@ -152,7 +152,7 @@ hooks = [
'action': [
'python3',
'-c',
'import os, subprocess; os.chdir(os.path.join("src", "electron")); subprocess.check_call(["node", ".yarn/releases/yarn-4.11.0.cjs", "install", "--immutable"]);',
'import os, subprocess; os.chdir(os.path.join("src", "electron")); subprocess.check_call(["node", ".yarn/releases/yarn-4.12.0.cjs", "install", "--immutable"]);',
],
},
{

View File

@@ -9,7 +9,7 @@
"@electron/asar": "^3.2.13",
"@electron/docs-parser": "^2.0.0",
"@electron/fiddle-core": "^1.3.4",
"@electron/github-app-auth": "^2.2.1",
"@electron/github-app-auth": "^3.2.0",
"@electron/lint-roller": "^3.1.2",
"@electron/typescript-definitions": "^9.1.2",
"@octokit/rest": "^20.1.2",
@@ -140,7 +140,7 @@
"abstract-socket": "github:deepak1556/node-abstractsocket#928cc591decd12aff7dad96449da8afc29832c19",
"minimist@npm:~0.0.1": "0.2.4"
},
"packageManager": "yarn@4.11.0",
"packageManager": "yarn@4.12.0",
"workspaces": [
"spec",
"spec/fixtures/native-addon/*"

View File

@@ -143,3 +143,7 @@ allow_electron_to_depend_on_components_os_crypt_sync.patch
expose_referrerscriptinfo_hostdefinedoptionsindex.patch
chore_disable_protocol_handler_dcheck.patch
fix_release_mouse_buttons_on_focus_loss_on_wayland.patch
viz_fix_visual_artifacts_due_to_resizing_root_render_pass_with_dcomp.patch
viz_do_not_overallocate_surface_on_initial_render.patch
viz_create_isbufferqueuesupportedandenabled.patch
viz_fix_visual_artifacts_while_resizing_window_with_dcomp.patch

View File

@@ -46,7 +46,7 @@ index 7280ef29b85c1b16b11dd9e4d628a9eb579bb4dd..ab56e29d402a400a8c91aa97b6e82ad7
# than here in :chrome_dll.
deps += [ "//chrome:packed_resources_integrity_header" ]
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 15cfa64348e80a3507fc83c3819e9abdb238bffb..4650080f45da4e321d4b0f0dabd98f2bf097c7c2 100644
index d8978eb678048850cc0e629d0c978f23417b5be9..219c9ae3dde4f2239b5c1331b99c8f2e9a170628 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -7571,9 +7571,12 @@ test("unit_tests") {

View File

@@ -312,7 +312,7 @@ index 7e3d46902fbf736b4240eb3fcb89975a7b222197..57fdc89fc265ad70cb0bff8443cc1026
auto DrawAsSinglePath = [&]() {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index a25e99fac5f5a171becff833464cdb3dfe7522c2..123a7c1fc980b1b3bcbe0e3e00afa594632d720b 100644
index 2e464ef7bbfd7e0d84df348d012e8020d4758726..b59eceacbd4143ef183bb67c39f9ccccc7582adb 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -214,6 +214,10 @@

View File

@@ -0,0 +1,93 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niklas Wenzel <dev@nikwen.de>
Date: Wed, 3 Dec 2025 17:10:02 +0100
Subject: viz: Create IsBufferQueueSupportedAndEnabled()
Manual backport of crrev.com/c/7210913
Bug: 457463689
Change-Id: I31bbaa6b5d79697c6bb5e1fc6738f6ea5a937b4f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7210913
Reviewed-by: Michael Tang <tangm@microsoft.com>
Commit-Queue: David Sanders <dsanders11@ucsbalum.com>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1553190}
diff --git a/components/viz/service/display/output_surface.cc b/components/viz/service/display/output_surface.cc
index ff795eb057ac64f40aa842fec8e053d12f57f538..71287614c627d39f8d019889498205ab3eff2a69 100644
--- a/components/viz/service/display/output_surface.cc
+++ b/components/viz/service/display/output_surface.cc
@@ -21,6 +21,16 @@
namespace viz {
+namespace {
+
+#if BUILDFLAG(IS_WIN)
+// Use BufferQueue for the primary plane instead of a DXGI swap chain or DComp
+// surface.
+BASE_FEATURE(kBufferQueue, base::FEATURE_DISABLED_BY_DEFAULT);
+#endif
+
+} // namespace
+
OutputSurface::Capabilities::Capabilities() = default;
OutputSurface::Capabilities::~Capabilities() = default;
OutputSurface::Capabilities::Capabilities(const Capabilities& capabilities) =
@@ -94,6 +104,12 @@ bool IsDelegatedCompositingSupportedAndEnabled(
// Ensure we check the feature flag iff the feature is supported.
return features::IsDelegatedCompositingEnabled();
}
+
+bool IsBufferQueueSupportedAndEnabled(
+ OutputSurface::DCSupportLevel support_level) {
+ return support_level >= OutputSurface::DCSupportLevel::kDCompDynamicTexture &&
+ base::FeatureList::IsEnabled(kBufferQueue);
+}
#endif
} // namespace viz
diff --git a/components/viz/service/display/output_surface.h b/components/viz/service/display/output_surface.h
index 25306ab6e18a266efdc329e4ddd81f5303033f4c..589f4c10dad9c807c9e3ce7baba63795b629435b 100644
--- a/components/viz/service/display/output_surface.h
+++ b/components/viz/service/display/output_surface.h
@@ -307,6 +307,9 @@ class VIZ_SERVICE_EXPORT OutputSurface {
// `features::IsDelegatedCompositingEnabled()`.
bool IsDelegatedCompositingSupportedAndEnabled(
OutputSurface::DCSupportLevel support_level);
+
+bool IsBufferQueueSupportedAndEnabled(
+ OutputSurface::DCSupportLevel support_level);
#endif
} // namespace viz
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index e34e15dda13a183568fc3e186d3b89da1e828ad4..9b9a4c02c975799fe42b04f0d5b680274d28b09e 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -121,12 +121,6 @@ namespace {
BASE_FEATURE(kDumpWithoutCrashingOnMissingRenderPassBacking,
base::FEATURE_ENABLED_BY_DEFAULT);
-#if BUILDFLAG(IS_WIN)
-// Use BufferQueue for the primary plane instead of a DXGI swap chain or DComp
-// surface.
-BASE_FEATURE(kBufferQueue, base::FEATURE_DISABLED_BY_DEFAULT);
-#endif
-
// Smallest unit that impacts anti-aliasing output. We use this to determine
// when an exterior edge (with AA) has been clipped (no AA). The specific value
// was chosen to match that used by gl_renderer.
@@ -992,10 +986,8 @@ SkiaRenderer::SkiaRenderer(const RendererSettings* settings,
// It's possible to use BufferQueue with DComp textures, so we can optionally
// enable it behind a feature flag.
- const bool want_buffer_queue =
- output_surface_->capabilities().dc_support_level >=
- OutputSurface::DCSupportLevel::kDCompDynamicTexture &&
- base::FeatureList::IsEnabled(kBufferQueue);
+ const bool want_buffer_queue = IsBufferQueueSupportedAndEnabled(
+ output_surface_->capabilities().dc_support_level);
#else
const bool want_buffer_queue = true;
#endif

View File

@@ -0,0 +1,45 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niklas Wenzel <dev@nikwen.de>
Date: Wed, 3 Dec 2025 17:08:55 +0100
Subject: viz: Do not overallocate surface on initial render
Manual backport of crrev.com/c/7129658
Change-Id: I0baa5865dbe66efc7b0f3f793c8e89cdc6aaa0b6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7129658
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: Michael Tang <tangm@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1544293}
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc
index c03a4b3db61371021a94128f698126b5fef2f577..01abf5d36e2e117acf6f9cdc91307c9ac5616453 100644
--- a/components/viz/service/display/direct_renderer.cc
+++ b/components/viz/service/display/direct_renderer.cc
@@ -1081,10 +1081,13 @@ gfx::Size DirectRenderer::CalculateTextureSizeForRenderPass(
// buffer area and number of reallocations to quantify the trade-off.
gfx::Size DirectRenderer::CalculateSizeForOutputSurface(
const gfx::Size& requested_viewport_size) {
+ const gfx::Size surface_size = surface_size_for_swap_buffers();
+
// We're not able to clip back buffers if output surface does not support
- // clipping.
- if (requested_viewport_size == surface_size_for_swap_buffers() ||
+ // clipping. We don't round on the initial frame when a window is first shown.
+ if (requested_viewport_size == surface_size ||
!output_surface_->capabilities().supports_viewporter ||
+ surface_size.IsZero() ||
settings_->dont_round_texture_sizes_for_pixel_tests) {
device_viewport_size_ = requested_viewport_size;
return requested_viewport_size;
@@ -1102,8 +1105,8 @@ gfx::Size DirectRenderer::CalculateSizeForOutputSurface(
// allows backings to be more easily reused during a resize operation.
const int request_width = requested_viewport_size.width();
const int request_height = requested_viewport_size.height();
- int surface_width = surface_size_for_swap_buffers().width();
- int surface_height = surface_size_for_swap_buffers().height();
+ int surface_width = surface_size.width();
+ int surface_height = surface_size.height();
constexpr int multiple = 256;
// If |request_width| or |request_height| is already a multiple of |multiple|,

View File

@@ -0,0 +1,43 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niklas Wenzel <dev@nikwen.de>
Date: Thu, 20 Nov 2025 11:51:44 -0800
Subject: viz: Fix visual artifacts due to resizing root render pass with DComp
Backport of crrev.com/c/7156576
Refs https://github.com/electron/electron/issues/36280#issuecomment-3560964534
Bug: 457463689
Change-Id: I7e00eadb2a1c3b44d64939d1a870d89befee158b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7156576
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Commit-Queue: Jonathan Ross <jonross@chromium.org>
Reviewed-by: Michael Tang <tangm@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1547987}
diff --git a/components/viz/service/display_embedder/skia_output_device_dcomp.cc b/components/viz/service/display_embedder/skia_output_device_dcomp.cc
index 81649eb59eb71ac950779af0f521a1f2a02e3add..7ac9ea1cdc4416a7af8dc2a75404cbc15be6cfad 100644
--- a/components/viz/service/display_embedder/skia_output_device_dcomp.cc
+++ b/components/viz/service/display_embedder/skia_output_device_dcomp.cc
@@ -39,6 +39,11 @@
namespace viz {
namespace {
+// With DirectComposition, resize surface based on root render pass size to
+// avoid gutter which shows stale pixels.
+BASE_FEATURE(kDirectCompositionResizeBasedOnRootSurface,
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
base::TimeTicks g_last_reshape_failure = base::TimeTicks();
NOINLINE void CheckForLoopFailures() {
@@ -155,6 +160,8 @@ SkiaOutputDeviceDComp::SkiaOutputDeviceDComp(
capabilities_.renderer_allocates_images = true;
capabilities_.supports_viewporter = presenter_->SupportsViewporter();
capabilities_.supports_non_backed_solid_color_overlays = true;
+ capabilities_.resize_based_on_root_surface =
+ base::FeatureList::IsEnabled(kDirectCompositionResizeBasedOnRootSurface);
DCHECK(context_state_);
DCHECK(context_state_->gr_context() ||

View File

@@ -0,0 +1,122 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Niklas Wenzel <dev@nikwen.de>
Date: Wed, 3 Dec 2025 17:42:58 +0100
Subject: viz: Fix visual artifacts while resizing window with DComp
Manual backport of crrev.com/c/7115438
Bug: 457463689
Change-Id: I9c684effe15e0b112ae533faa243e5a035e9c875
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7115438
Commit-Queue: David Sanders <dsanders11@ucsbalum.com>
Reviewed-by: Michael Tang <tangm@microsoft.com>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1553192}
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc
index 01abf5d36e2e117acf6f9cdc91307c9ac5616453..7e45d9ea46d0d4095169daf748e20c98db21969d 100644
--- a/components/viz/service/display/direct_renderer.cc
+++ b/components/viz/service/display/direct_renderer.cc
@@ -243,6 +243,31 @@ void DirectRenderer::DrawFrame(
current_frame()->device_viewport_size = device_viewport_size;
current_frame()->display_color_spaces = display_color_spaces;
+ gfx::Size surface_resource_size =
+ CalculateSizeForOutputSurface(device_viewport_size);
+
+#if BUILDFLAG(IS_WIN)
+ if (output_surface_->capabilities().clear_drawn_areas_outside_viewport &&
+ device_viewport_size != surface_resource_size) {
+ // On Windows with DirectComposition, we cannot synchronize the swap chain
+ // |Present| and the DComp |Commit| calls to take effect at the same time.
+ // (Both take effect asynchronously.) Hence, presenting a frame and changing
+ // the DComp layer clip rect can happen at different times. This can lead to
+ // ugly visual artifacts while resizing the window because it can reveal
+ // areas of the surface that are outside the viewport (crbug.com/457463689).
+ // To prevent those artifacts, we clear areas outside of the viewport with a
+ // transparent color. Transparency is expensive, so we use it only while
+ // resizing.
+ // This line gives us a transparent image format and triggers the background
+ // to be cleared in |SkiaRenderer::ClearFramebuffer|.
+ root_render_pass->has_transparent_background = true;
+ // Redraw and swap the whole surface.
+ root_render_pass->output_rect = gfx::Rect(surface_resource_size);
+ current_frame()->root_damage_rect = gfx::Rect(surface_resource_size);
+ current_frame()->device_viewport_size = surface_resource_size;
+ }
+#endif
+
output_surface_->SetNeedsMeasureNextDrawLatency();
BeginDrawingFrame();
@@ -274,8 +299,6 @@ void DirectRenderer::DrawFrame(
current_frame()->display_color_spaces.GetOutputBufferFormat(
current_frame()->root_render_pass->content_color_usage,
frame_has_alpha));
- gfx::Size surface_resource_size =
- CalculateSizeForOutputSurface(device_viewport_size);
if (overlay_processor_) {
// Display transform and viewport size are needed for overlay validator on
// Android SurfaceControl, and viewport size is need on Windows. These need
@@ -397,8 +420,10 @@ void DirectRenderer::DrawFrame(
// If we need to redraw the frame, the whole output should be considered
// damaged.
- if (needs_full_frame_redraw)
- current_frame()->root_damage_rect = gfx::Rect(device_viewport_size);
+ if (needs_full_frame_redraw) {
+ current_frame()->root_damage_rect =
+ gfx::Rect(current_frame()->device_viewport_size);
+ }
if (!skip_drawing_root_render_pass) {
DrawRenderPassAndExecuteCopyRequests(root_render_pass);
diff --git a/components/viz/service/display/output_surface.h b/components/viz/service/display/output_surface.h
index 589f4c10dad9c807c9e3ce7baba63795b629435b..641bbfc732c88141ddd929a4c334360462259ee4 100644
--- a/components/viz/service/display/output_surface.h
+++ b/components/viz/service/display/output_surface.h
@@ -106,6 +106,11 @@ class VIZ_SERVICE_EXPORT OutputSurface {
#if BUILDFLAG(IS_WIN)
// Whether this OutputSurface supports direct composition layers.
DCSupportLevel dc_support_level = DCSupportLevel::kNone;
+ // Whether to 1) clear all drawn areas outside the viewport with a
+ // transparent background color when drawing a frame and 2) swap them. This
+ // is necessary if the surface clip rect can get out of sync with the
+ // viewport size (e.g., due to a race condition).
+ bool clear_drawn_areas_outside_viewport = false;
#endif
// Whether this OutputSurface should skip DrawAndSwap(). This is true for
// the unified display on Chrome OS. All drawing is handled by the physical
diff --git a/components/viz/service/display_embedder/skia_output_device_dcomp.cc b/components/viz/service/display_embedder/skia_output_device_dcomp.cc
index 7ac9ea1cdc4416a7af8dc2a75404cbc15be6cfad..8e027d1382c5d639c1e114b8e25b6cea3af3445d 100644
--- a/components/viz/service/display_embedder/skia_output_device_dcomp.cc
+++ b/components/viz/service/display_embedder/skia_output_device_dcomp.cc
@@ -39,10 +39,8 @@
namespace viz {
namespace {
-// With DirectComposition, resize surface based on root render pass size to
-// avoid gutter which shows stale pixels.
-BASE_FEATURE(kDirectCompositionResizeBasedOnRootSurface,
- base::FEATURE_ENABLED_BY_DEFAULT);
+// Apply fixes for crbug.com/457463689.
+BASE_FEATURE(kDirectCompositionResizeFixes, base::FEATURE_ENABLED_BY_DEFAULT);
base::TimeTicks g_last_reshape_failure = base::TimeTicks();
@@ -161,7 +159,14 @@ SkiaOutputDeviceDComp::SkiaOutputDeviceDComp(
capabilities_.supports_viewporter = presenter_->SupportsViewporter();
capabilities_.supports_non_backed_solid_color_overlays = true;
capabilities_.resize_based_on_root_surface =
- base::FeatureList::IsEnabled(kDirectCompositionResizeBasedOnRootSurface);
+ base::FeatureList::IsEnabled(kDirectCompositionResizeFixes);
+ // With delegated compositing or a buffer queue, |Present| and |Commit| are
+ // synchronized and the clear is not needed.
+ capabilities_.clear_drawn_areas_outside_viewport =
+ base::FeatureList::IsEnabled(kDirectCompositionResizeFixes) &&
+ !IsDelegatedCompositingSupportedAndEnabled(
+ capabilities_.dc_support_level) &&
+ !IsBufferQueueSupportedAndEnabled(capabilities_.dc_support_level);
DCHECK(context_state_);
DCHECK(context_state_->gr_context() ||

View File

@@ -1 +1,2 @@
chore_expose_ui_to_allow_electron_to_set_dock_side.patch
fix_element_tree_flickering_with_node_inspection.patch

View File

@@ -0,0 +1,107 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alex Rudenko <alexrudenko@chromium.org>
Date: Thu, 20 Nov 2025 11:18:30 +0100
Subject: Fix element tree flickering with node inspection
Regressed in https://crrev.com/c/6888910. The highlighting in the tree
outline emits the INSPECT_MODE_WILL_BE_TOGGLED on the overlay model
causing the tree to clear the highlight immediately. This CL
recovers the logic missed in the https://crrev.com/c/6888910
to prevent re-entrancy during highlighting.
Fixed: 462120622
Change-Id: I08af098f7a142085c2fb16511031855623e07c4b
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7170551
Reviewed-by: Philip Pfaffe <pfaffe@chromium.org>
Commit-Queue: Philip Pfaffe <pfaffe@chromium.org>
Auto-Submit: Alex Rudenko <alexrudenko@chromium.org>
diff --git a/front_end/panels/elements/DOMTreeWidget.test.ts b/front_end/panels/elements/DOMTreeWidget.test.ts
index 43ae133087a61c47c84349c7550485bd52b23847..d83fddd7afc1871b8064631d63c1b6b1e5357b70 100644
--- a/front_end/panels/elements/DOMTreeWidget.test.ts
+++ b/front_end/panels/elements/DOMTreeWidget.test.ts
@@ -24,6 +24,7 @@ describeWithMockConnection('DOMTreeWidget', () => {
elementsTreeOutline,
alreadyExpandedParentTreeElement: null,
highlightedTreeElement: null,
+ isUpdatingHighlights: false,
});
const domTree = new Elements.ElementsTreeOutline.DOMTreeWidget(undefined, view);
domTree.performUpdate();
diff --git a/front_end/panels/elements/ElementsTreeOutline.ts b/front_end/panels/elements/ElementsTreeOutline.ts
index bd8093e1c0961648e782234ed5826273d6ace6d9..c6c8d9d29a84f872126ca0b7c847dffe08c285ad 100644
--- a/front_end/panels/elements/ElementsTreeOutline.ts
+++ b/front_end/panels/elements/ElementsTreeOutline.ts
@@ -105,6 +105,7 @@ interface ViewInput {
interface ViewOutput {
elementsTreeOutline?: ElementsTreeOutline;
highlightedTreeElement: ElementsTreeElement|null;
+ isUpdatingHighlights: boolean;
alreadyExpandedParentTreeElement: ElementsTreeElement|null;
}
@@ -136,6 +137,7 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
// Node highlighting logic. FIXME: express as a lit template.
const previousHighlightedNode = output.highlightedTreeElement?.node() ?? null;
if (previousHighlightedNode !== input.currentHighlightedNode) {
+ output.isUpdatingHighlights = true;
let treeElement: ElementsTreeElement|null = null;
if (output.highlightedTreeElement) {
@@ -173,6 +175,7 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
output.highlightedTreeElement = treeElement;
output.elementsTreeOutline.setHoverEffect(treeElement);
treeElement?.reveal(true);
+ output.isUpdatingHighlights = false;
}
};
@@ -225,6 +228,7 @@ export class DOMTreeWidget extends UI.Widget.Widget {
#viewOutput: ViewOutput = {
highlightedTreeElement: null,
alreadyExpandedParentTreeElement: null,
+ isUpdatingHighlights: false,
};
#highlightThrottler = new Common.Throttler.Throttler(100);
@@ -239,8 +243,8 @@ export class DOMTreeWidget extends UI.Widget.Widget {
SDK.OverlayModel.OverlayModel, SDK.OverlayModel.Events.HIGHLIGHT_NODE_REQUESTED, this.#highlightNode, this,
{scoped: true});
SDK.TargetManager.TargetManager.instance().addModelListener(
- SDK.OverlayModel.OverlayModel, SDK.OverlayModel.Events.INSPECT_MODE_WILL_BE_TOGGLED, this.#clearState, this,
- {scoped: true});
+ SDK.OverlayModel.OverlayModel, SDK.OverlayModel.Events.INSPECT_MODE_WILL_BE_TOGGLED,
+ this.#clearHighlightedNode, this, {scoped: true});
}
}
@@ -251,7 +255,13 @@ export class DOMTreeWidget extends UI.Widget.Widget {
});
}
- #clearState(): void {
+ #clearHighlightedNode(): void {
+ // Highlighting an element via tree outline will emit the
+ // INSPECT_MODE_WILL_BE_TOGGLED event, therefore, we skip it if the view
+ // informed us that it is updating the element.
+ if (this.#viewOutput.isUpdatingHighlights) {
+ return;
+ }
this.#currentHighlightedNode = null;
this.requestUpdate();
}
@@ -305,11 +315,11 @@ export class DOMTreeWidget extends UI.Widget.Widget {
currentHighlightedNode: this.#currentHighlightedNode,
onElementsTreeUpdated: this.onElementsTreeUpdated.bind(this),
onSelectedNodeChanged: event => {
- this.#clearState();
+ this.#clearHighlightedNode();
this.onSelectedNodeChanged(event);
},
- onElementCollapsed: this.#clearState.bind(this),
- onElementExpanded: this.#clearState.bind(this),
+ onElementCollapsed: this.#clearHighlightedNode.bind(this),
+ onElementExpanded: this.#clearHighlightedNode.bind(this),
},
this.#viewOutput, this.contentElement);
}

View File

@@ -1,6 +1,6 @@
const path = require('node:path');
exports.YARN_SCRIPT_PATH = path.resolve(__dirname, '..', '.yarn/releases/yarn-4.11.0.cjs');
exports.YARN_SCRIPT_PATH = path.resolve(__dirname, '..', '.yarn/releases/yarn-4.12.0.cjs');
if (require.main === module) {
require(exports.YARN_SCRIPT_PATH);

View File

@@ -155,7 +155,8 @@ void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
if (rightmostMenuPoint > screenRight)
position.x = position.x - [menu size].width;
[popup_controllers_[window_id] setCloseCallback:std::move(close_callback)];
[popup_controllers_[window_id]
setPopupCloseCallback:std::move(close_callback)];
if (frame && frame->render_frame_host()) {
auto* rfh = frame->render_frame_host()->GetOutermostMainFrameOrEmbedder();

View File

@@ -14,6 +14,12 @@ const bool debug_notifications =
base::Environment::Create()->HasVar("ELECTRON_DEBUG_NOTIFICATIONS");
NotificationOptions::NotificationOptions() = default;
NotificationOptions::NotificationOptions(const NotificationOptions&) = default;
NotificationOptions& NotificationOptions::operator=(
const NotificationOptions&) = default;
NotificationOptions::NotificationOptions(NotificationOptions&&) = default;
NotificationOptions& NotificationOptions::operator=(NotificationOptions&&) =
default;
NotificationOptions::~NotificationOptions() = default;
Notification::Notification(NotificationDelegate* delegate,

View File

@@ -43,6 +43,10 @@ struct NotificationOptions {
std::u16string toast_xml;
NotificationOptions();
NotificationOptions(const NotificationOptions&);
NotificationOptions& operator=(const NotificationOptions&);
NotificationOptions(NotificationOptions&&);
NotificationOptions& operator=(NotificationOptions&&);
~NotificationOptions();
};

View File

@@ -16,11 +16,13 @@
#include "base/containers/fixed_flat_map.h"
#include "base/hash/hash.h"
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/string_util_win.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/thread_pool.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "shell/browser/notifications/notification_delegate.h"
@@ -97,14 +99,16 @@ const std::string FailureResultToString(HRESULT failure_reason) {
"The notification platform does not have the proper privileges to "
"complete the request."}});
std::string hresult_str = base::StrCat(
{" (HRESULT: ", base::NumberToString(static_cast<long>(failure_reason)),
")"});
if (const auto it = kFailureMessages.find(failure_reason);
it != kFailureMessages.end()) {
return base::StrCat({"Notification failed - ", it->second});
return base::StrCat({"Notification failed - ", it->second, hresult_str});
}
return base::StrCat({"Notification failed - Unknown failure reason (HRESULT ",
base::NumberToString(static_cast<long>(failure_reason)),
")"});
return hresult_str;
}
constexpr char kToast[] = "toast";
@@ -155,6 +159,17 @@ ComPtr<winui::Notifications::IToastNotifier>*
WindowsToastNotification::toast_notifier_ = nullptr;
// static
scoped_refptr<base::SequencedTaskRunner>
WindowsToastNotification::GetToastTaskRunner() {
// Use function-local static to avoid exit-time destructor warning
static base::NoDestructor<scoped_refptr<base::SequencedTaskRunner>>
task_runner(base::ThreadPool::CreateSequencedTaskRunner(
{base::TaskPriority::USER_BLOCKING,
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
base::MayBlock()}));
return *task_runner;
}
bool WindowsToastNotification::Initialize() {
// Just initialize, don't care if it fails or already initialized.
Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
@@ -207,13 +222,277 @@ WindowsToastNotification::~WindowsToastNotification() {
}
}
// This method posts a request onto the toast background thread, which
// creates the toast xml then posts notification creation to the UI thread. This
// avoids blocking the UI for expensive XML parsing and COM initialization or
// the COM server becoming unavailable. All needed fields are captured before
// posting the task.
// The method will eventually result in a display or failure signal being posted
// back to the UI thread, where further callbacks (clicked, dismissed, failed)
// are handled by ToastEventHandler.
void WindowsToastNotification::Show(const NotificationOptions& options) {
if (SUCCEEDED(ShowInternal(options))) {
DebugLog("Notification created");
if (delegate())
delegate()->NotificationDisplayed();
DebugLog("WindowsToastNotification::Show called");
DebugLog(base::StrCat(
{"toast_xml empty: ", options.toast_xml.empty() ? "yes" : "no"}));
if (!options.toast_xml.empty()) {
DebugLog(base::StrCat({"toast_xml length: ",
base::NumberToString(options.toast_xml.length())}));
}
// Capture all needed data on UI thread before posting to background thread
std::string notif_id = notification_id();
NotificationPresenter* presenter_ptr = presenter();
base::WeakPtr<Notification> weak_this = GetWeakPtr();
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner =
content::GetUIThreadTaskRunner({});
DebugLog("Posting task to background thread");
auto task_runner = GetToastTaskRunner();
DebugLog(base::StrCat({"Task runner valid: ", task_runner ? "yes" : "no"}));
// Post Show operation to background thread to prevent blocking
// This is the main entry point for the notification creation process
bool posted = task_runner->PostTask(
FROM_HERE,
base::BindOnce(
&WindowsToastNotification::CreateToastNotificationOnBackgroundThread,
options, presenter_ptr, notif_id, weak_this, ui_task_runner));
DebugLog(base::StrCat(
{"Task posted to background thread: ", posted ? "yes" : "no"}));
}
// Creates the toast XML on the background thread. If the XML is invalid, posts
// a failure event back to the UI thread. Otherwise, continues to create the
// toast notification on the background thread.
void WindowsToastNotification::CreateToastNotificationOnBackgroundThread(
const NotificationOptions& options,
NotificationPresenter* presenter,
const std::string& notification_id,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
DebugLog("CreateToastXmlOnBackgroundThread called");
ComPtr<IXmlDocument> toast_xml;
if (!CreateToastXmlDocument(options, presenter, weak_notification,
ui_task_runner, &toast_xml)) {
return; // Error already posted to UI thread
}
// Continue to create the toast notification
ComPtr<ABI::Windows::UI::Notifications::IToastNotification>
toast_notification;
if (!CreateToastNotification(toast_xml, notification_id, weak_notification,
ui_task_runner, &toast_notification)) {
return; // Error already posted to UI thread
}
// Setup callbacks and show on UI thread (Show must be called on UI thread)
scoped_refptr<base::SingleThreadTaskRunner> ui_runner =
content::GetUIThreadTaskRunner({});
ui_runner->PostTask(
FROM_HERE,
base::BindOnce(&WindowsToastNotification::SetupAndShowOnUIThread,
weak_notification, toast_notification));
}
// Creates the toast XML document on the background thread. Returns true on
// success, false on failure. On failure, posts error to UI thread. static
bool WindowsToastNotification::CreateToastXmlDocument(
const NotificationOptions& options,
NotificationPresenter* presenter,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
ComPtr<IXmlDocument>* toast_xml) {
// The custom xml takes priority over the preset template.
if (!options.toast_xml.empty()) {
DebugLog(base::StrCat({"Processing custom toast_xml, length: ",
base::NumberToString(options.toast_xml.length())}));
HRESULT hr = XmlDocumentFromString(base::as_wcstr(options.toast_xml),
toast_xml->GetAddressOf());
DebugLog(base::StrCat({"XmlDocumentFromString returned HRESULT: ",
base::NumberToString(hr)}));
if (FAILED(hr)) {
std::string err =
base::StrCat({"XML: Invalid XML, ERROR ", FailureResultToString(hr)});
DebugLog(base::StrCat({"XML parsing failed, posting error: ", err}));
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
DebugLog("PostNotificationFailedToUIThread called");
return false;
}
DebugLog("XML parsing succeeded");
} else {
auto* presenter_win = static_cast<NotificationPresenterWin*>(presenter);
std::wstring icon_path =
presenter_win->SaveIconToFilesystem(options.icon, options.icon_url);
std::u16string toast_xml_str =
GetToastXml(options.title, options.msg, icon_path, options.timeout_type,
options.silent);
HRESULT hr = XmlDocumentFromString(base::as_wcstr(toast_xml_str),
toast_xml->GetAddressOf());
if (FAILED(hr)) {
std::string err =
base::StrCat({"XML: Invalid XML, ERROR ", FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
}
return true;
}
// Creates the toast notification on the background thread. Returns true on
// success, false on failure. On failure, posts error to UI thread. On success,
// returns the created notification via out parameter.
bool WindowsToastNotification::CreateToastNotification(
ComPtr<ABI::Windows::Data::Xml::Dom::IXmlDocument> toast_xml,
const std::string& notification_id,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
ComPtr<ABI::Windows::UI::Notifications::IToastNotification>*
toast_notification) {
ScopedHString toast_str(
RuntimeClass_Windows_UI_Notifications_ToastNotification);
if (!toast_str.success()) {
PostNotificationFailedToUIThread(
weak_notification, "Creating ScopedHString failed", ui_task_runner);
return false;
}
ComPtr<winui::Notifications::IToastNotificationFactory> toast_factory;
HRESULT hr =
Windows::Foundation::GetActivationFactory(toast_str, &toast_factory);
if (FAILED(hr)) {
std::string err =
base::StrCat({"WinAPI: GetActivationFactory failed, ERROR ",
FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
hr = toast_factory->CreateToastNotification(
toast_xml.Get(), toast_notification->GetAddressOf());
if (FAILED(hr)) {
std::string err =
base::StrCat({"WinAPI: CreateToastNotification failed, ERROR ",
FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
ComPtr<winui::Notifications::IToastNotification2> toast2;
hr = (*toast_notification)->QueryInterface(IID_PPV_ARGS(&toast2));
if (FAILED(hr)) {
std::string err =
base::StrCat({"WinAPI: Getting Notification interface failed, ERROR ",
FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
ScopedHString group(kGroup);
hr = toast2->put_Group(group);
if (FAILED(hr)) {
std::string err = base::StrCat(
{"WinAPI: Setting group failed, ERROR ", FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
ScopedHString tag(GetTag(notification_id));
hr = toast2->put_Tag(tag);
if (FAILED(hr)) {
std::string err = base::StrCat(
{"WinAPI: Setting tag failed, ERROR ", FailureResultToString(hr)});
DebugLog(err);
PostNotificationFailedToUIThread(weak_notification, err, ui_task_runner);
return false;
}
return true;
}
// Sets up callbacks and shows the notification on the UI thread.
// This part has to be called on the UI thread. This WinRT API
// does not allow calls from background threads.
void WindowsToastNotification::SetupAndShowOnUIThread(
base::WeakPtr<Notification> weak_notification,
ComPtr<ABI::Windows::UI::Notifications::IToastNotification> notification) {
auto* notif = static_cast<WindowsToastNotification*>(weak_notification.get());
if (!notif)
return;
// Setup callbacks and store notification on UI thread
HRESULT hr = notif->SetupCallbacks(notification.Get());
if (FAILED(hr)) {
std::string err = base::StrCat(
{"WinAPI: SetupCallbacks failed, ERROR ", FailureResultToString(hr)});
DebugLog(err);
notif->NotificationFailed(err);
return;
}
notif->toast_notification_ = notification;
// Show notification on UI thread (must be called on UI thread)
hr = (*toast_notifier_)->Show(notification.Get());
if (FAILED(hr)) {
std::string err = base::StrCat(
{"WinAPI: Show failed, ERROR ", FailureResultToString(hr)});
DebugLog(err);
notif->NotificationFailed(err);
return;
}
DebugLog("Notification created");
if (notif->delegate())
notif->delegate()->NotificationDisplayed();
}
// Posts a notification failure event back to the UI thread. If the UI thread's
// task runner is not provided, it fetches it. On the UI thread, calls
// NotificationFailed on the Notification instance (if it is still valid), which
// will invoke the delegate (if set) and clean up.
void WindowsToastNotification::PostNotificationFailedToUIThread(
base::WeakPtr<Notification> weak_notification,
const std::string& error,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
DebugLog(base::StrCat(
{"PostNotificationFailedToUIThread called with error: ", error}));
if (!ui_task_runner) {
ui_task_runner = content::GetUIThreadTaskRunner({});
}
ui_task_runner->PostTask(
FROM_HERE,
base::BindOnce(
[](base::WeakPtr<Notification> weak_notification,
const std::string& error) {
DebugLog(
"PostNotificationFailedToUIThread lambda executing on UI "
"thread");
if (!weak_notification) {
DebugLog(base::StrCat(
{"Notification failed but object destroyed: ", error}));
return;
}
// Call NotificationFailed - it will check for delegate internally
// and emit the event if delegate is set
DebugLog(base::StrCat(
{"Calling NotificationFailed with error: ", error}));
auto* delegate = weak_notification->delegate();
DebugLog(
base::StrCat({"Delegate is set: ", delegate ? "yes" : "no"}));
// Call NotificationFailed which will call delegate if set, then
// cleanup
weak_notification->NotificationFailed(error);
DebugLog("NotificationFailed call completed");
},
weak_notification, error));
}
void WindowsToastNotification::Remove() {
@@ -243,64 +522,6 @@ void WindowsToastNotification::Dismiss() {
(*toast_notifier_)->Hide(toast_notification_.Get());
}
HRESULT WindowsToastNotification::ShowInternal(
const NotificationOptions& options) {
ComPtr<IXmlDocument> toast_xml;
// The custom xml takes priority over the preset template.
if (!options.toast_xml.empty()) {
REPORT_AND_RETURN_IF_FAILED(
XmlDocumentFromString(base::as_wcstr(options.toast_xml), &toast_xml),
"XML: Invalid XML");
} else {
auto* presenter_win = static_cast<NotificationPresenterWin*>(presenter());
std::wstring icon_path =
presenter_win->SaveIconToFilesystem(options.icon, options.icon_url);
std::u16string toast_xml_str =
GetToastXml(options.title, options.msg, icon_path, options.timeout_type,
options.silent);
REPORT_AND_RETURN_IF_FAILED(
XmlDocumentFromString(base::as_wcstr(toast_xml_str), &toast_xml),
"XML: Invalid XML");
}
ScopedHString toast_str(
RuntimeClass_Windows_UI_Notifications_ToastNotification);
if (!toast_str.success()) {
NotificationFailed("Creating ScopedHString failed");
return E_FAIL;
}
ComPtr<winui::Notifications::IToastNotificationFactory> toast_factory;
REPORT_AND_RETURN_IF_FAILED(
Windows::Foundation::GetActivationFactory(toast_str, &toast_factory),
"WinAPI: GetActivationFactory failed");
REPORT_AND_RETURN_IF_FAILED(toast_factory->CreateToastNotification(
toast_xml.Get(), &toast_notification_),
"WinAPI: CreateToastNotification failed");
ComPtr<winui::Notifications::IToastNotification2> toast2;
REPORT_AND_RETURN_IF_FAILED(
toast_notification_->QueryInterface(IID_PPV_ARGS(&toast2)),
"WinAPI: Getting Notification interface failed");
ScopedHString group(kGroup);
REPORT_AND_RETURN_IF_FAILED(toast2->put_Group(group),
"WinAPI: Setting group failed");
ScopedHString tag(GetTag(notification_id()));
REPORT_AND_RETURN_IF_FAILED(toast2->put_Tag(tag),
"WinAPI: Setting tag failed");
REPORT_AND_RETURN_IF_FAILED(SetupCallbacks(toast_notification_.Get()),
"WinAPI: SetupCallbacks failed");
REPORT_AND_RETURN_IF_FAILED(
(*toast_notifier_)->Show(toast_notification_.Get()),
"WinAPI: Show failed");
return S_OK;
}
std::u16string WindowsToastNotification::GetToastXml(
const std::u16string& title,
const std::u16string& msg,

View File

@@ -14,6 +14,8 @@
#include <wrl/implements.h>
#include <string>
#include "base/memory/scoped_refptr.h"
#include "base/task/single_thread_task_runner.h"
#include "shell/browser/notifications/notification.h"
using Microsoft::WRL::ClassicCom;
@@ -58,12 +60,12 @@ class WindowsToastNotification : public Notification {
friend class ToastEventHandler;
HRESULT ShowInternal(const NotificationOptions& options);
std::u16string GetToastXml(const std::u16string& title,
const std::u16string& msg,
const std::wstring& icon_path,
const std::u16string& timeout_type,
const bool silent);
HRESULT XmlDocumentFromString(
static std::u16string GetToastXml(const std::u16string& title,
const std::u16string& msg,
const std::wstring& icon_path,
const std::u16string& timeout_type,
const bool silent);
static HRESULT XmlDocumentFromString(
const wchar_t* xmlString,
ABI::Windows::Data::Xml::Dom::IXmlDocument** doc);
HRESULT SetupCallbacks(
@@ -71,12 +73,43 @@ class WindowsToastNotification : public Notification {
bool RemoveCallbacks(
ABI::Windows::UI::Notifications::IToastNotification* toast);
// Helper methods for async Show() implementation
static bool CreateToastXmlDocument(
const NotificationOptions& options,
NotificationPresenter* presenter,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
ComPtr<ABI::Windows::Data::Xml::Dom::IXmlDocument>* toast_xml);
static void CreateToastNotificationOnBackgroundThread(
const NotificationOptions& options,
NotificationPresenter* presenter,
const std::string& notification_id,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
static bool CreateToastNotification(
ComPtr<ABI::Windows::Data::Xml::Dom::IXmlDocument> toast_xml,
const std::string& notification_id,
base::WeakPtr<Notification> weak_notification,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
ComPtr<ABI::Windows::UI::Notifications::IToastNotification>*
toast_notification);
static void SetupAndShowOnUIThread(
base::WeakPtr<Notification> weak_notification,
ComPtr<ABI::Windows::UI::Notifications::IToastNotification> notification);
static void PostNotificationFailedToUIThread(
base::WeakPtr<Notification> weak_notification,
const std::string& error,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
static ComPtr<
ABI::Windows::UI::Notifications::IToastNotificationManagerStatics>*
toast_manager_;
static ComPtr<ABI::Windows::UI::Notifications::IToastNotifier>*
toast_notifier_;
// Returns the task runner for toast operations, creating it if necessary.
static scoped_refptr<base::SequencedTaskRunner> GetToastTaskRunner();
EventRegistrationToken activated_token_;
EventRegistrationToken dismissed_token_;
EventRegistrationToken failed_token_;

View File

@@ -28,7 +28,7 @@ class ElectronMenuModel;
NSMenu* __strong menu_;
BOOL isMenuOpen_;
BOOL useDefaultAccelerator_;
base::OnceClosure closeCallback;
base::OnceClosure popupCloseCallback;
}
// Builds a NSMenu from the pre-built model (must not be nil). Changes made
@@ -36,7 +36,7 @@ class ElectronMenuModel;
- (id)initWithModel:(electron::ElectronMenuModel*)model
useDefaultAccelerator:(BOOL)use;
- (void)setCloseCallback:(base::OnceClosure)callback;
- (void)setPopupCloseCallback:(base::OnceClosure)callback;
// Populate current NSMenu with |model|.
- (void)populateWithModel:(electron::ElectronMenuModel*)model;

View File

@@ -186,8 +186,8 @@ NSArray* ConvertSharingItemToNS(const SharingItem& item) {
model_ = nullptr;
}
- (void)setCloseCallback:(base::OnceClosure)callback {
closeCallback = std::move(callback);
- (void)setPopupCloseCallback:(base::OnceClosure)callback {
popupCloseCallback = std::move(callback);
}
- (void)populateWithModel:(electron::ElectronMenuModel*)model {
@@ -221,9 +221,9 @@ NSArray* ConvertSharingItemToNS(const SharingItem& item) {
isMenuOpen_ = NO;
if (model_)
model_->MenuWillClose();
if (!closeCallback.is_null()) {
content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE,
std::move(closeCallback));
if (!popupCloseCallback.is_null()) {
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, std::move(popupCloseCallback));
}
}
}
@@ -567,18 +567,25 @@ NSArray* ConvertSharingItemToNS(const SharingItem& item) {
if (!isMenuOpen_)
return;
// We should only respond to the top-level menu's close event.
if (menu != menu_)
return;
bool has_close_cb = !popupCloseCallback.is_null();
// There are two scenarios where we should emit menu-did-close:
// 1. It's a popup and the top level menu is closed.
// 2. It's an application menu, and the current menu's supermenu
// is the top-level menu.
if (menu != menu_) {
if (has_close_cb || menu.supermenu != menu_)
return;
}
isMenuOpen_ = NO;
if (model_)
model_->MenuWillClose();
// Post async task so that itemSelected runs before the close callback
// deletes the controller from the map which deallocates it
if (!closeCallback.is_null()) {
// deletes the controller from the map which deallocates it.
if (has_close_cb) {
content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE,
std::move(closeCallback));
std::move(popupCloseCallback));
}
}

476
yarn.lock
View File

@@ -580,15 +580,15 @@ __metadata:
languageName: node
linkType: hard
"@electron/github-app-auth@npm:^2.2.1":
version: 2.2.1
resolution: "@electron/github-app-auth@npm:2.2.1"
"@electron/github-app-auth@npm:^3.2.0":
version: 3.2.0
resolution: "@electron/github-app-auth@npm:3.2.0"
dependencies:
"@octokit/auth-app": "npm:^4.0.13"
"@octokit/rest": "npm:^19.0.11"
"@octokit/auth-app": "npm:^8.1.0"
"@octokit/rest": "npm:^22.0.0"
bin:
github-app-auth-build: dist/bin.js
checksum: 10c0/b57b34367b8d9060f6345906ee6804437d490a3b9085ef9fea94557622f2925c5b8eba2ec2eaa87e789ccb504209e41afdb01bbeee718099d390240c903b93d9
checksum: 10c0/1d6755baa85603f6bf4017b4ee1adb72b049d10b213421e955c3ae2a13f37c97836fc6f58f5028bcb5a5e422b69446d05eae07512880f67e9a333a4801ab6657
languageName: node
linkType: hard
@@ -1086,70 +1086,57 @@ __metadata:
languageName: node
linkType: hard
"@octokit/auth-app@npm:^4.0.13":
version: 4.0.13
resolution: "@octokit/auth-app@npm:4.0.13"
"@octokit/auth-app@npm:^8.1.0":
version: 8.1.2
resolution: "@octokit/auth-app@npm:8.1.2"
dependencies:
"@octokit/auth-oauth-app": "npm:^5.0.0"
"@octokit/auth-oauth-user": "npm:^2.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/request-error": "npm:^3.0.0"
"@octokit/types": "npm:^9.0.0"
deprecation: "npm:^2.3.1"
lru-cache: "npm:^9.0.0"
universal-github-app-jwt: "npm:^1.1.1"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/71289c45180b564f80cf508e15a5438678c9a16d4e2911e33f949644b6d1ac91294ab3e1af4d9f43e96763a79ae0c12ec91a2fdebbeea95d3f9b4a280f8ea1b4
"@octokit/auth-oauth-app": "npm:^9.0.3"
"@octokit/auth-oauth-user": "npm:^6.0.2"
"@octokit/request": "npm:^10.0.6"
"@octokit/request-error": "npm:^7.0.2"
"@octokit/types": "npm:^16.0.0"
toad-cache: "npm:^3.7.0"
universal-github-app-jwt: "npm:^2.2.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/0888176d84a760cacdf0b546f677332583a6a221b1b5c4a1a44ecc8ad6505ce2408234b21fa8d99961f7d545423a83a6c3becf5a9eb9476ebcb614096ce267e0
languageName: node
linkType: hard
"@octokit/auth-oauth-app@npm:^5.0.0":
version: 5.0.5
resolution: "@octokit/auth-oauth-app@npm:5.0.5"
"@octokit/auth-oauth-app@npm:^9.0.3":
version: 9.0.3
resolution: "@octokit/auth-oauth-app@npm:9.0.3"
dependencies:
"@octokit/auth-oauth-device": "npm:^4.0.0"
"@octokit/auth-oauth-user": "npm:^2.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/types": "npm:^9.0.0"
"@types/btoa-lite": "npm:^1.0.0"
btoa-lite: "npm:^1.0.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/6d74dfb63c2fa91d3f77aed7f929779364fb182b3f251302b77517946abff0bdd0f420cf15fd366a83a6fd8f553bbd6eed0040e37bc92ab9bbe8ee725e8b2aa6
"@octokit/auth-oauth-device": "npm:^8.0.3"
"@octokit/auth-oauth-user": "npm:^6.0.2"
"@octokit/request": "npm:^10.0.6"
"@octokit/types": "npm:^16.0.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/1b47dc2a6ea480c04cc3b03d03f4836916ef666047b639c78134d49bbf9fb112a0610021aa017abaa30d8a63a5e66117b3d2b3a4d3976d10153bd5efef54da8b
languageName: node
linkType: hard
"@octokit/auth-oauth-device@npm:^4.0.0":
version: 4.0.3
resolution: "@octokit/auth-oauth-device@npm:4.0.3"
"@octokit/auth-oauth-device@npm:^8.0.3":
version: 8.0.3
resolution: "@octokit/auth-oauth-device@npm:8.0.3"
dependencies:
"@octokit/oauth-methods": "npm:^2.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/types": "npm:^8.0.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/6a33b8d86a29db4a201c8934cc47ede5d15b62fd1bf5a846796c70f705c4cf01594cb7c3e694e21038c97ef1f2c3e7d663f565dd9f51d3e4f85eb29931501148
"@octokit/oauth-methods": "npm:^6.0.2"
"@octokit/request": "npm:^10.0.6"
"@octokit/types": "npm:^16.0.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/2c43d131fbd0b60abef5f37e6168e31f5ec1b8361bac1d71c19499e1960e5e00957c54db9836d88754b467ad48c4e15f60409b0d66dc740468c49834e787e971
languageName: node
linkType: hard
"@octokit/auth-oauth-user@npm:^2.0.0":
version: 2.0.4
resolution: "@octokit/auth-oauth-user@npm:2.0.4"
"@octokit/auth-oauth-user@npm:^6.0.2":
version: 6.0.2
resolution: "@octokit/auth-oauth-user@npm:6.0.2"
dependencies:
"@octokit/auth-oauth-device": "npm:^4.0.0"
"@octokit/oauth-methods": "npm:^2.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/types": "npm:^8.0.0"
btoa-lite: "npm:^1.0.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/c7933795c6d44d20d3b1a8d730ba02f6a5713800e3e29df4cb09dc24d0e2bb89e82fc366282c6e314b5eb70c811ab5f878f1763c81a71513185c91bc2646afac
languageName: node
linkType: hard
"@octokit/auth-token@npm:^3.0.0":
version: 3.0.3
resolution: "@octokit/auth-token@npm:3.0.3"
dependencies:
"@octokit/types": "npm:^9.0.0"
checksum: 10c0/ff33a5bbfcef8f9303d5fb7fd4757828490efe893ebe894f4ae5faa7bd37cc8d732408ce5f565bb6ad476f0d601ac3205b2256077530caebc7bac80dab8e4770
"@octokit/auth-oauth-device": "npm:^8.0.3"
"@octokit/oauth-methods": "npm:^6.0.2"
"@octokit/request": "npm:^10.0.6"
"@octokit/types": "npm:^16.0.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/7af66189e7c0b19c456462d571f61ac787d8464554375b12ded245d0d209a7a0f873f9189d7a3e9afef8aa59eb268c573f8e98b0ee683ebf0989625c20e2125a
languageName: node
linkType: hard
@@ -1160,18 +1147,10 @@ __metadata:
languageName: node
linkType: hard
"@octokit/core@npm:^4.2.1":
version: 4.2.1
resolution: "@octokit/core@npm:4.2.1"
dependencies:
"@octokit/auth-token": "npm:^3.0.0"
"@octokit/graphql": "npm:^5.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/request-error": "npm:^3.0.0"
"@octokit/types": "npm:^9.0.0"
before-after-hook: "npm:^2.2.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/b21f60d1ceb8a1aa8cc1573718de2941aad1d2ca5c46ed4b6a2feec4830463efd32434e9452655455f6e6ea0a9fe030d4a09c1b7e0be7cd194afb51dade405e9
"@octokit/auth-token@npm:^6.0.0":
version: 6.0.0
resolution: "@octokit/auth-token@npm:6.0.0"
checksum: 10c0/32ecc904c5f6f4e5d090bfcc679d70318690c0a0b5040cd9a25811ad9dcd44c33f2cf96b6dbee1cd56cf58fde28fb1819c01b58718aa5c971f79c822357cb5c0
languageName: node
linkType: hard
@@ -1190,14 +1169,28 @@ __metadata:
languageName: node
linkType: hard
"@octokit/endpoint@npm:^7.0.0":
version: 7.0.3
resolution: "@octokit/endpoint@npm:7.0.3"
"@octokit/core@npm:^7.0.6":
version: 7.0.6
resolution: "@octokit/core@npm:7.0.6"
dependencies:
"@octokit/types": "npm:^8.0.0"
is-plain-object: "npm:^5.0.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/e592d889d8cc290dc8858162e342328373b241e236561ed559f1632b993e1facfe8793d36106d5c0a1ac5e3f340b4e69a32519e801a7415e06a4ed419dac08bd
"@octokit/auth-token": "npm:^6.0.0"
"@octokit/graphql": "npm:^9.0.3"
"@octokit/request": "npm:^10.0.6"
"@octokit/request-error": "npm:^7.0.2"
"@octokit/types": "npm:^16.0.0"
before-after-hook: "npm:^4.0.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/95a328ff7c7223d9eb4aa778c63171828514ae0e0f588d33beb81a4dc03bbeae055382f6060ce23c979ab46272409942ff2cf3172109999e48429c47055b1fbe
languageName: node
linkType: hard
"@octokit/endpoint@npm:^11.0.2":
version: 11.0.2
resolution: "@octokit/endpoint@npm:11.0.2"
dependencies:
"@octokit/types": "npm:^16.0.0"
universal-user-agent: "npm:^7.0.2"
checksum: 10c0/878ac12fbccff772968689b4744590677c5a3f12bebe31544832c84761bf1c6be521e8a3af07abffc9455a74dd4d1f350d714fc46fd7ce14a0a2b5f2d4e3a84c
languageName: node
linkType: hard
@@ -1211,17 +1204,6 @@ __metadata:
languageName: node
linkType: hard
"@octokit/graphql@npm:^5.0.0":
version: 5.0.5
resolution: "@octokit/graphql@npm:5.0.5"
dependencies:
"@octokit/request": "npm:^6.0.0"
"@octokit/types": "npm:^9.0.0"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/78c26c2951f95fb3db05729938631af00dad0cd8bc9ff67d213b30e49dc26b485b7d94f81ef4d017ae8ebbebf6bcbaf375fbd8ec88483113ed152c930e1bec68
languageName: node
linkType: hard
"@octokit/graphql@npm:^7.1.0":
version: 7.1.1
resolution: "@octokit/graphql@npm:7.1.1"
@@ -1233,44 +1215,33 @@ __metadata:
languageName: node
linkType: hard
"@octokit/oauth-authorization-url@npm:^5.0.0":
version: 5.0.0
resolution: "@octokit/oauth-authorization-url@npm:5.0.0"
checksum: 10c0/f9059cc070a06a276c43adfd106f995883c4ac846f00f0fef9218c2675355d7321cf9e8f83855574ba5104f37bc06a599a4c3e5edc3dc07714d9c9f4d34a47e2
languageName: node
linkType: hard
"@octokit/oauth-methods@npm:^2.0.0":
version: 2.0.4
resolution: "@octokit/oauth-methods@npm:2.0.4"
"@octokit/graphql@npm:^9.0.3":
version: 9.0.3
resolution: "@octokit/graphql@npm:9.0.3"
dependencies:
"@octokit/oauth-authorization-url": "npm:^5.0.0"
"@octokit/request": "npm:^6.0.0"
"@octokit/request-error": "npm:^3.0.0"
"@octokit/types": "npm:^8.0.0"
btoa-lite: "npm:^1.0.0"
checksum: 10c0/a3b3173569ac72c726fc98542b1538156e7a51e78fcea0f9f776da26b3cba5f722edcc89ccc1def228be664f8edf71dd706686cbb952508930584a5cbe0b01c0
"@octokit/request": "npm:^10.0.6"
"@octokit/types": "npm:^16.0.0"
universal-user-agent: "npm:^7.0.0"
checksum: 10c0/58588d3fb2834f64244fa5376ca7922a30117b001b621e141fab0d52806370803ab0c046ac99b120fa5f45b770f52a815157fb6ffc147fc6c1da4047c1f1af49
languageName: node
linkType: hard
"@octokit/openapi-types@npm:^14.0.0":
version: 14.0.0
resolution: "@octokit/openapi-types@npm:14.0.0"
checksum: 10c0/d122bbfd4997ea7e056c7fcf5b3240982b5b090b816671eca01829ac5ce19d2a19f6da35d126ae19a956a4203c68302d8fb33d5c00c77996b4e4a746878ea589
"@octokit/oauth-authorization-url@npm:^8.0.0":
version: 8.0.0
resolution: "@octokit/oauth-authorization-url@npm:8.0.0"
checksum: 10c0/ab4964bebd8d076f945a2f3210a8a0a221a408362569d9fc2f49875ad06e594365f5fd871dac08d820793f687bff50237f7acf40d9d39c5f9de7575b6f4bad93
languageName: node
linkType: hard
"@octokit/openapi-types@npm:^16.0.0":
version: 16.0.0
resolution: "@octokit/openapi-types@npm:16.0.0"
checksum: 10c0/8d45fc0249e8ba0c0c1ef4de5ac2dddbb8f8b42b66383d58ab026b59282f908466d344a98ef0ff198b1d42ef1fae7e6f8b69ab88c11c955d3ac54426bf6c17d2
languageName: node
linkType: hard
"@octokit/openapi-types@npm:^17.2.0":
version: 17.2.0
resolution: "@octokit/openapi-types@npm:17.2.0"
checksum: 10c0/baec94b9c300171245d8b0592867ef96d3aa9cbb3261e961c5138e91894e165fffc421288d98f51031af12ab4149efb7ba597d79dee2e5b5a38962348528b1e5
"@octokit/oauth-methods@npm:^6.0.2":
version: 6.0.2
resolution: "@octokit/oauth-methods@npm:6.0.2"
dependencies:
"@octokit/oauth-authorization-url": "npm:^8.0.0"
"@octokit/request": "npm:^10.0.6"
"@octokit/request-error": "npm:^7.0.2"
"@octokit/types": "npm:^16.0.0"
checksum: 10c0/51d2f3218839ce37609e6e0adc274efcc198bdcae57ef3ecf3ada95f6f30dcc3052f6db34e4aa3a1bc94545d7025baa44058d5c044fdd6bdd83562eb9b8510c2
languageName: node
linkType: hard
@@ -1281,6 +1252,13 @@ __metadata:
languageName: node
linkType: hard
"@octokit/openapi-types@npm:^27.0.0":
version: 27.0.0
resolution: "@octokit/openapi-types@npm:27.0.0"
checksum: 10c0/602d1de033da180a2e982cdbd3646bd5b2e16ecf36b9955a0f23e37ae9e6cb086abb48ff2ae6f2de000fce03e8ae9051794611ae4a95a8f5f6fb63276e7b8e31
languageName: node
linkType: hard
"@octokit/plugin-paginate-rest@npm:11.4.4-cjs.2":
version: 11.4.4-cjs.2
resolution: "@octokit/plugin-paginate-rest@npm:11.4.4-cjs.2"
@@ -1292,24 +1270,14 @@ __metadata:
languageName: node
linkType: hard
"@octokit/plugin-paginate-rest@npm:^6.1.2":
version: 6.1.2
resolution: "@octokit/plugin-paginate-rest@npm:6.1.2"
"@octokit/plugin-paginate-rest@npm:^14.0.0":
version: 14.0.0
resolution: "@octokit/plugin-paginate-rest@npm:14.0.0"
dependencies:
"@octokit/tsconfig": "npm:^1.0.2"
"@octokit/types": "npm:^9.2.3"
"@octokit/types": "npm:^16.0.0"
peerDependencies:
"@octokit/core": ">=4"
checksum: 10c0/def241c4f00b864822ab6414eaadd8679a6d332004c7e77467cfc1e6d5bdcc453c76bd185710ee942e4df201f9dd2170d960f46af5b14ef6f261a0068f656364
languageName: node
linkType: hard
"@octokit/plugin-request-log@npm:^1.0.4":
version: 1.0.4
resolution: "@octokit/plugin-request-log@npm:1.0.4"
peerDependencies:
"@octokit/core": ">=3"
checksum: 10c0/7238585445555db553912e0cdef82801c89c6e5cbc62c23ae086761c23cc4a403d6c3fddd20348bbd42fb7508e2c2fce370eb18fdbe3fbae2c0d2c8be974f4cc
"@octokit/core": ">=6"
checksum: 10c0/841d79d4ccfe18fc809a4a67529b75c1dcdda13399bf4bf5b48ce7559c8b4b2cd422e3204bad4cbdea31c0cf0943521067415268e5bcfc615a3b813e058cad6b
languageName: node
linkType: hard
@@ -1322,6 +1290,15 @@ __metadata:
languageName: node
linkType: hard
"@octokit/plugin-request-log@npm:^6.0.0":
version: 6.0.0
resolution: "@octokit/plugin-request-log@npm:6.0.0"
peerDependencies:
"@octokit/core": ">=6"
checksum: 10c0/40e46ad0c77235742d0bf698ab4e17df1ae06e0d7824ffc5867ed71e27de860875adb73d89629b823fe8647459a8f262c26ed1aa6ee374873fa94095f37df0bb
languageName: node
linkType: hard
"@octokit/plugin-rest-endpoint-methods@npm:13.3.2-cjs.1":
version: 13.3.2-cjs.1
resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.3.2-cjs.1"
@@ -1333,26 +1310,14 @@ __metadata:
languageName: node
linkType: hard
"@octokit/plugin-rest-endpoint-methods@npm:^7.1.2":
version: 7.1.2
resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.1.2"
"@octokit/plugin-rest-endpoint-methods@npm:^17.0.0":
version: 17.0.0
resolution: "@octokit/plugin-rest-endpoint-methods@npm:17.0.0"
dependencies:
"@octokit/types": "npm:^9.2.3"
deprecation: "npm:^2.3.1"
"@octokit/types": "npm:^16.0.0"
peerDependencies:
"@octokit/core": ">=3"
checksum: 10c0/bb2207c830c410e47e54337a439ac5594bf62d5986501d6bad9593ad2ee9f1e2ad9f2d492ced6104bd9cd12262a75027fbf2ec4d5569685ec7cb363b3271d8c0
languageName: node
linkType: hard
"@octokit/request-error@npm:^3.0.0":
version: 3.0.2
resolution: "@octokit/request-error@npm:3.0.2"
dependencies:
"@octokit/types": "npm:^8.0.0"
deprecation: "npm:^2.0.0"
once: "npm:^1.4.0"
checksum: 10c0/88962e8373f41513d8e101f1232c50f63933e4fd5c27f6739aca648ff8c517e82e885fa444c1153f01fd7c974c34ce680682226813b914c6b42eb14e3068b950
"@octokit/core": ">=6"
checksum: 10c0/cf9984d7cf6a36ff7ff1b86078ae45fe246e3df10fcef0bccf20c8cfd27bf5e7d98dcb9cf5a7b56332b9c6fa30be28d159c2987d272a4758f77056903d94402f
languageName: node
linkType: hard
@@ -1367,17 +1332,25 @@ __metadata:
languageName: node
linkType: hard
"@octokit/request@npm:^6.0.0":
version: 6.2.4
resolution: "@octokit/request@npm:6.2.4"
"@octokit/request-error@npm:^7.0.2":
version: 7.1.0
resolution: "@octokit/request-error@npm:7.1.0"
dependencies:
"@octokit/endpoint": "npm:^7.0.0"
"@octokit/request-error": "npm:^3.0.0"
"@octokit/types": "npm:^9.0.0"
is-plain-object: "npm:^5.0.0"
node-fetch: "npm:^2.6.7"
universal-user-agent: "npm:^6.0.0"
checksum: 10c0/3efd42bbddff96c270bdae09f7a57d51e1bb570c214edf8bf2c2d22ae86348cb6ef7963468fb040339d0dacd1c9acb3545152ae88859b0e57323258e6432e5b1
"@octokit/types": "npm:^16.0.0"
checksum: 10c0/62b90a54545c36a30b5ffdda42e302c751be184d85b68ffc7f1242c51d7ca54dbd185b7d0027b491991776923a910c85c9c51269fe0d86111bac187507a5abc4
languageName: node
linkType: hard
"@octokit/request@npm:^10.0.6":
version: 10.0.7
resolution: "@octokit/request@npm:10.0.7"
dependencies:
"@octokit/endpoint": "npm:^11.0.2"
"@octokit/request-error": "npm:^7.0.2"
"@octokit/types": "npm:^16.0.0"
fast-content-type-parse: "npm:^3.0.0"
universal-user-agent: "npm:^7.0.2"
checksum: 10c0/f789a75bf681b204ccd3d538921db662e148ed980005158d80ec4f16811e9ab73f375d4f30ef697852abd748a62f025060ea1b0c5198ec9c2e8d04e355064390
languageName: node
linkType: hard
@@ -1393,18 +1366,6 @@ __metadata:
languageName: node
linkType: hard
"@octokit/rest@npm:^19.0.11":
version: 19.0.11
resolution: "@octokit/rest@npm:19.0.11"
dependencies:
"@octokit/core": "npm:^4.2.1"
"@octokit/plugin-paginate-rest": "npm:^6.1.2"
"@octokit/plugin-request-log": "npm:^1.0.4"
"@octokit/plugin-rest-endpoint-methods": "npm:^7.1.2"
checksum: 10c0/a14ae31fc5e70e76d2492aae63d3453cbb71f44e7492400f885ab5ac6b2612bcb244bafa29e45a59461f3e5d99807ff9c88d48af8317ffa4f8ad3f8f11fdd035
languageName: node
linkType: hard
"@octokit/rest@npm:^20.1.2":
version: 20.1.2
resolution: "@octokit/rest@npm:20.1.2"
@@ -1417,10 +1378,15 @@ __metadata:
languageName: node
linkType: hard
"@octokit/tsconfig@npm:^1.0.2":
version: 1.0.2
resolution: "@octokit/tsconfig@npm:1.0.2"
checksum: 10c0/84db70b495beeed69259dd4def14cdfb600edeb65ef32811558c99413ee2b414ed10bff9c4dcc7a43451d0fd36b4925ada9ef7d4272b5eae38cb005cc2f459ac
"@octokit/rest@npm:^22.0.0":
version: 22.0.1
resolution: "@octokit/rest@npm:22.0.1"
dependencies:
"@octokit/core": "npm:^7.0.6"
"@octokit/plugin-paginate-rest": "npm:^14.0.0"
"@octokit/plugin-request-log": "npm:^6.0.0"
"@octokit/plugin-rest-endpoint-methods": "npm:^17.0.0"
checksum: 10c0/f3abd84e887cc837973214ce70720a9bba53f5575f40601c6122aa25206e9055d859c0388437f0a137f6cd0e4ff405e1b46b903475b0db32a17bada0c6513d5b
languageName: node
linkType: hard
@@ -1433,30 +1399,12 @@ __metadata:
languageName: node
linkType: hard
"@octokit/types@npm:^8.0.0":
version: 8.0.0
resolution: "@octokit/types@npm:8.0.0"
"@octokit/types@npm:^16.0.0":
version: 16.0.0
resolution: "@octokit/types@npm:16.0.0"
dependencies:
"@octokit/openapi-types": "npm:^14.0.0"
checksum: 10c0/2c51b30f7f48c8a51e8aa9c932bd0fb7c6746b4e5b154299e3d462180f5642d4ce1cc19d92a64a7bd1b1b3df09a0c3af416940c81b269ddcad51c834464af731
languageName: node
linkType: hard
"@octokit/types@npm:^9.0.0":
version: 9.0.0
resolution: "@octokit/types@npm:9.0.0"
dependencies:
"@octokit/openapi-types": "npm:^16.0.0"
checksum: 10c0/33e165e9ddaf7f1e8e94e3e48e2bb73f6193b1405887c382b5079450bebf67fe844784e3bb91c90acdb5718c3551936202de3ee98aaf7f7ec428a064032e158a
languageName: node
linkType: hard
"@octokit/types@npm:^9.2.3":
version: 9.2.3
resolution: "@octokit/types@npm:9.2.3"
dependencies:
"@octokit/openapi-types": "npm:^17.2.0"
checksum: 10c0/9604939ed79be2298827e832177bb8e871d44170144a7504adb0c399966e45361fb909ccffacbd7151f08b94d2e739c6a2d1c0b9a2f9a4bde09c968d27060514
"@octokit/openapi-types": "npm:^27.0.0"
checksum: 10c0/b8d41098ba6fc194d13d641f9441347e3a3b96c0efabac0e14f57319340a2d4d1c8676e4cb37ab3062c5c323c617e790b0126916e9bf7b201b0cced0826f8ae2
languageName: node
linkType: hard
@@ -1575,13 +1523,6 @@ __metadata:
languageName: node
linkType: hard
"@types/btoa-lite@npm:^1.0.0":
version: 1.0.0
resolution: "@types/btoa-lite@npm:1.0.0"
checksum: 10c0/ab354cfa11b683fcc97c66cd2199b0a630b771dc13e3f98783c9f15beba3bdf031b9925c924252473888da3737a07dec93971226e0310354e58f9e64a03a102f
languageName: node
linkType: hard
"@types/busboy@npm:^1.5.4":
version: 1.5.4
resolution: "@types/busboy@npm:1.5.4"
@@ -1795,15 +1736,6 @@ __metadata:
languageName: node
linkType: hard
"@types/jsonwebtoken@npm:^9.0.0":
version: 9.0.1
resolution: "@types/jsonwebtoken@npm:9.0.1"
dependencies:
"@types/node": "npm:*"
checksum: 10c0/e603f206c91dac01f23096c6d2aaba014ab60357fc270afef4c68449c335643d76dc1c21cc6464c89d0fb8f7e471d14a03a4ffb13b62d7133c97f61e75d2fcdd
languageName: node
linkType: hard
"@types/katex@npm:^0.16.0":
version: 0.16.7
resolution: "@types/katex@npm:0.16.7"
@@ -3150,6 +3082,13 @@ __metadata:
languageName: node
linkType: hard
"before-after-hook@npm:^4.0.0":
version: 4.0.0
resolution: "before-after-hook@npm:4.0.0"
checksum: 10c0/9f8ae8d1b06142bcfb9ef6625226b5e50348bb11210f266660eddcf9734e0db6f9afc4cb48397ee3f5ac0a3728f3ae401cdeea88413f7bed748a71db84657be2
languageName: node
linkType: hard
"big.js@npm:^5.2.2":
version: 5.2.2
resolution: "big.js@npm:5.2.2"
@@ -3274,13 +3213,6 @@ __metadata:
languageName: node
linkType: hard
"btoa-lite@npm:^1.0.0":
version: 1.0.0
resolution: "btoa-lite@npm:1.0.0"
checksum: 10c0/7a4f0568ae3c915464650f98fde7901ae07b13a333a614515a0c86876b3528670fafece28dfef9745d971a613bb83341823afb0c20c6f318b384c1e364b9eb95
languageName: node
linkType: hard
"buffer-crc32@npm:~0.2.3":
version: 0.2.13
resolution: "buffer-crc32@npm:0.2.13"
@@ -3288,13 +3220,6 @@ __metadata:
languageName: node
linkType: hard
"buffer-equal-constant-time@npm:1.0.1":
version: 1.0.1
resolution: "buffer-equal-constant-time@npm:1.0.1"
checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e
languageName: node
linkType: hard
"buffer-from@npm:^1.0.0":
version: 1.1.2
resolution: "buffer-from@npm:1.1.2"
@@ -4410,7 +4335,7 @@ __metadata:
languageName: node
linkType: hard
"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1":
"deprecation@npm:^2.0.0":
version: 2.3.1
resolution: "deprecation@npm:2.3.1"
checksum: 10c0/23d688ba66b74d09b908c40a76179418acbeeb0bfdf218c8075c58ad8d0c315130cb91aa3dffb623aa3a411a3569ce56c6460de6c8d69071c17fe6dd2442f032
@@ -4579,15 +4504,6 @@ __metadata:
languageName: node
linkType: hard
"ecdsa-sig-formatter@npm:1.0.11":
version: 1.0.11
resolution: "ecdsa-sig-formatter@npm:1.0.11"
dependencies:
safe-buffer: "npm:^5.0.1"
checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c
languageName: node
linkType: hard
"ee-first@npm:1.1.1":
version: 1.1.1
resolution: "ee-first@npm:1.1.1"
@@ -4662,7 +4578,7 @@ __metadata:
"@electron/asar": "npm:^3.2.13"
"@electron/docs-parser": "npm:^2.0.0"
"@electron/fiddle-core": "npm:^1.3.4"
"@electron/github-app-auth": "npm:^2.2.1"
"@electron/github-app-auth": "npm:^3.2.0"
"@electron/lint-roller": "npm:^3.1.2"
"@electron/typescript-definitions": "npm:^9.1.2"
"@octokit/rest": "npm:^20.1.2"
@@ -5816,6 +5732,13 @@ __metadata:
languageName: node
linkType: hard
"fast-content-type-parse@npm:^3.0.0":
version: 3.0.0
resolution: "fast-content-type-parse@npm:3.0.0"
checksum: 10c0/06251880c83b7118af3a5e66e8bcee60d44f48b39396fc60acc2b4630bd5f3e77552b999b5c8e943d45a818854360e5e97164c374ec4b562b4df96a2cdf2e188
languageName: node
linkType: hard
"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
version: 3.1.3
resolution: "fast-deep-equal@npm:3.1.3"
@@ -7642,13 +7565,6 @@ __metadata:
languageName: node
linkType: hard
"is-plain-object@npm:^5.0.0":
version: 5.0.0
resolution: "is-plain-object@npm:5.0.0"
checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c
languageName: node
linkType: hard
"is-primitive@npm:^3.0.1":
version: 3.0.1
resolution: "is-primitive@npm:3.0.1"
@@ -8065,18 +7981,6 @@ __metadata:
languageName: node
linkType: hard
"jsonwebtoken@npm:^9.0.0":
version: 9.0.0
resolution: "jsonwebtoken@npm:9.0.0"
dependencies:
jws: "npm:^3.2.2"
lodash: "npm:^4.17.21"
ms: "npm:^2.1.1"
semver: "npm:^7.3.8"
checksum: 10c0/60c30d90d8a69b8e7148306e0c299ac120dbde9c032add48d26df928fe349e952cf4b09f12d7942257681a936e3374e4d49280ab20f8a4578688c7f08d87f9bc
languageName: node
linkType: hard
"jsx-ast-utils@npm:^2.4.1 || ^3.0.0":
version: 3.3.3
resolution: "jsx-ast-utils@npm:3.3.3"
@@ -8113,27 +8017,6 @@ __metadata:
languageName: node
linkType: hard
"jwa@npm:^1.4.1":
version: 1.4.1
resolution: "jwa@npm:1.4.1"
dependencies:
buffer-equal-constant-time: "npm:1.0.1"
ecdsa-sig-formatter: "npm:1.0.11"
safe-buffer: "npm:^5.0.1"
checksum: 10c0/5c533540bf38702e73cf14765805a94027c66a0aa8b16bc3e89d8d905e61a4ce2791e87e21be97d1293a5ee9d4f3e5e47737e671768265ca4f25706db551d5e9
languageName: node
linkType: hard
"jws@npm:^3.2.2":
version: 3.2.2
resolution: "jws@npm:3.2.2"
dependencies:
jwa: "npm:^1.4.1"
safe-buffer: "npm:^5.0.1"
checksum: 10c0/e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff
languageName: node
linkType: hard
"katex@npm:^0.16.0":
version: 0.16.22
resolution: "katex@npm:0.16.22"
@@ -8481,7 +8364,7 @@ __metadata:
languageName: node
linkType: hard
"lru-cache@npm:^9.0.0, lru-cache@npm:^9.1.1":
"lru-cache@npm:^9.1.1":
version: 9.1.1
resolution: "lru-cache@npm:9.1.1"
checksum: 10c0/a70630bccc94e6d6bf5523de8103302407a3b0090f4e245d126569ba96f85b4fa10ad537fb5d9435c58ba3762c0880361f8f5a92d7c9d10b59c8fcc8a0c615e5
@@ -12075,7 +11958,7 @@ __metadata:
languageName: node
linkType: hard
"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:~5.2.0":
"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3
@@ -13316,6 +13199,13 @@ __metadata:
languageName: node
linkType: hard
"toad-cache@npm:^3.7.0":
version: 3.7.0
resolution: "toad-cache@npm:3.7.0"
checksum: 10c0/7dae2782ee20b22c9798bb8b71dec7ec6a0091021d2ea9dd6e8afccab6b65b358fdba49a02209fac574499702e2c000660721516c87c2538d1b2c0ba03e8c0c3
languageName: node
linkType: hard
"toidentifier@npm:1.0.1":
version: 1.0.1
resolution: "toidentifier@npm:1.0.1"
@@ -13885,13 +13775,10 @@ __metadata:
languageName: node
linkType: hard
"universal-github-app-jwt@npm:^1.1.1":
version: 1.1.1
resolution: "universal-github-app-jwt@npm:1.1.1"
dependencies:
"@types/jsonwebtoken": "npm:^9.0.0"
jsonwebtoken: "npm:^9.0.0"
checksum: 10c0/f735a3fa0c9156898d128f45237eefa598edfab2424428ccc12e4b7dd9d217ff91b5a2b7a9a1ed6a16fd7985723f0ae34d5efbd3f81ab203c83184b7675c970a
"universal-github-app-jwt@npm:^2.2.0":
version: 2.2.2
resolution: "universal-github-app-jwt@npm:2.2.2"
checksum: 10c0/7ae5f031fb89c01a4407459b764c5e6341d725d436e1ceec161f9b754dd4883d9704cc8de53d5b6314b7e1bef8dbc7561799fc23001e706f213d468c17026fb6
languageName: node
linkType: hard
@@ -13902,6 +13789,13 @@ __metadata:
languageName: node
linkType: hard
"universal-user-agent@npm:^7.0.0, universal-user-agent@npm:^7.0.2":
version: 7.0.3
resolution: "universal-user-agent@npm:7.0.3"
checksum: 10c0/6043be466a9bb96c0ce82392842d9fddf4c37e296f7bacc2cb25f47123990eb436c82df824644f9c5070a94dbdb117be17f66d54599ab143648ec57ef93dbcc8
languageName: node
linkType: hard
"universalify@npm:^0.1.0":
version: 0.1.2
resolution: "universalify@npm:0.1.2"