mirror of
https://github.com/electron/electron.git
synced 2026-02-26 03:01:17 -05:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d18062d0f | ||
|
|
832ffb2330 | ||
|
|
03121eeaef | ||
|
|
8282c07a0f | ||
|
|
f2d1cb21b0 | ||
|
|
ef9b4162af | ||
|
|
6e97bca80d | ||
|
|
c511fc5c3f | ||
|
|
22dfbb0822 | ||
|
|
85913a38da | ||
|
|
a327629ca2 | ||
|
|
7deed2b980 | ||
|
|
65fc06a9f7 |
11
.github/actions/free-space-macos/action.yml
vendored
11
.github/actions/free-space-macos/action.yml
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -7,6 +7,8 @@ on:
|
||||
- 'spec/yarn.lock'
|
||||
- '.github/workflows/**'
|
||||
- '.github/actions/**'
|
||||
- '.yarn/**'
|
||||
- '.yarnrc.yml'
|
||||
|
||||
permissions: {}
|
||||
|
||||
|
||||
@@ -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
@@ -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
4
DEPS
@@ -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"]);',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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/*"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -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 @@
|
||||
|
||||
@@ -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
|
||||
@@ -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|,
|
||||
@@ -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() ||
|
||||
@@ -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() ||
|
||||
@@ -1 +1,2 @@
|
||||
chore_expose_ui_to_allow_electron_to_set_dock_side.patch
|
||||
fix_element_tree_flickering_with_node_inspection.patch
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -43,6 +43,10 @@ struct NotificationOptions {
|
||||
std::u16string toast_xml;
|
||||
|
||||
NotificationOptions();
|
||||
NotificationOptions(const NotificationOptions&);
|
||||
NotificationOptions& operator=(const NotificationOptions&);
|
||||
NotificationOptions(NotificationOptions&&);
|
||||
NotificationOptions& operator=(NotificationOptions&&);
|
||||
~NotificationOptions();
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
476
yarn.lock
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user