mirror of
https://github.com/electron/electron.git
synced 2026-02-19 03:14:51 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d0705d81f | ||
|
|
04995cd0bd | ||
|
|
b0085b13c2 | ||
|
|
7576621cde | ||
|
|
de5a1d1158 | ||
|
|
585eea3f30 | ||
|
|
5dbcb9fe10 |
@@ -1 +1 @@
|
||||
11.4.12
|
||||
11.5.0
|
||||
@@ -1,6 +1,6 @@
|
||||
import { app } from 'electron/main';
|
||||
import type { IpcMainInvokeEvent, WebContents } from 'electron/main';
|
||||
import { clipboard, crashReporter, nativeImage } from 'electron/common';
|
||||
import { clipboard, crashReporter } from 'electron/common';
|
||||
import * as fs from 'fs';
|
||||
import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
|
||||
import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
|
||||
@@ -132,7 +132,3 @@ ipcMainUtils.handleSync('ELECTRON_CRASH_REPORTER_SET_UPLOAD_TO_SERVER', (event:
|
||||
ipcMainUtils.handleSync('ELECTRON_CRASH_REPORTER_GET_CRASHES_DIRECTORY', () => {
|
||||
return crashReporter.getCrashesDirectory();
|
||||
});
|
||||
|
||||
ipcMainInternal.handle('ELECTRON_NATIVE_IMAGE_CREATE_THUMBNAIL_FROM_PATH', async (_, path: string, size: Electron.Size) => {
|
||||
return typeUtils.serialize(await nativeImage.createThumbnailFromPath(path, size));
|
||||
});
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
|
||||
import { deserialize } from '@electron/internal/common/type-utils';
|
||||
|
||||
const { nativeImage } = process._linkedBinding('electron_common_native_image');
|
||||
|
||||
nativeImage.createThumbnailFromPath = async (path: string, size: Electron.Size) => {
|
||||
return deserialize(await ipcRendererInternal.invoke('ELECTRON_NATIVE_IMAGE_CREATE_THUMBNAIL_FROM_PATH', path, size));
|
||||
};
|
||||
|
||||
export default nativeImage;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "electron",
|
||||
"version": "11.4.12",
|
||||
"version": "11.5.0",
|
||||
"repository": "https://github.com/electron/electron",
|
||||
"description": "Build cross platform desktop apps with JavaScript, HTML, and CSS",
|
||||
"devDependencies": {
|
||||
|
||||
@@ -181,3 +181,7 @@ cherry-pick-3feda0244490.patch
|
||||
cherry-pick-cd98d7c0dae9.patch
|
||||
replace_first_of_two_waitableevents_in_creditcardaccessmanager.patch
|
||||
cherry-pick-ac9dc1235e28.patch
|
||||
cherry-pick-1227933.patch
|
||||
cherry-pick-1231134.patch
|
||||
cherry-pick-1233564.patch
|
||||
cherry-pick-1234009.patch
|
||||
|
||||
215
patches/chromium/cherry-pick-1227933.patch
Normal file
215
patches/chromium/cherry-pick-1227933.patch
Normal file
@@ -0,0 +1,215 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Koji Ishii <kojii@chromium.org>
|
||||
Date: Mon, 26 Jul 2021 07:09:18 +0000
|
||||
Subject: Fix nested inline box fragmentation
|
||||
|
||||
This patch fixes when nested inline boxes are fragmented in a
|
||||
line due to bidi reordering.
|
||||
|
||||
Before this change, the fragmented boxes are appended to the
|
||||
end of |box_data_list_|. Then when |NGInlineLayoutStateStack::
|
||||
CreateBoxFragments| creates inline boxes in the ascending
|
||||
order of |box_data_list_|, it failed to add the fragmented
|
||||
boxes into their parent inline boxes.
|
||||
|
||||
This is critical for out-of-flow positioned objects whose
|
||||
containing block is an inline box, because they expect to be
|
||||
propagated through all ancestor inline boxes.
|
||||
|
||||
|UpdateBoxDataFragmentRange| is a little tricky by appending
|
||||
to a vector it is iterating. Changing it to insert to the
|
||||
correct position makes the function even trickier. This patch
|
||||
changes it to add fragmented boxes to a separate vector, and
|
||||
let later process |UpdateFragmentedBoxDataEdges| to merge the
|
||||
vector to |box_data_list_|.
|
||||
|
||||
(cherry picked from commit 9c8a39c14a9c80556468593cddf436f5047a16ce)
|
||||
|
||||
Bug: 1227933, 1229999
|
||||
Change-Id: I7edcd209e1fdac06bab01b16d660383e7e9c37bd
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3038308
|
||||
Commit-Queue: Koji Ishii <kojii@chromium.org>
|
||||
Reviewed-by: Yoshifumi Inoue <yosin@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/master@{#903356}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3053212
|
||||
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
|
||||
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
|
||||
Auto-Submit: Koji Ishii <kojii@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/4577@{#145}
|
||||
Cr-Branched-From: 761ddde228655e313424edec06497d0c56b0f3c4-refs/heads/master@{#902210}
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
|
||||
index c61298842eaa308b7ae863d6e1cf5457a8091dd2..f6fb0f03c3ec63c0c2de2b9501534108dea85422 100644
|
||||
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
|
||||
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h"
|
||||
|
||||
+#include "base/containers/adapters.h"
|
||||
#include "third_party/blink/renderer/core/layout/geometry/logical_offset.h"
|
||||
#include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
|
||||
#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_item_result.h"
|
||||
@@ -389,13 +390,14 @@ void NGInlineLayoutStateStack::UpdateAfterReorder(
|
||||
box_data.fragment_start = box_data.fragment_end = 0;
|
||||
|
||||
// Scan children and update start/end from their box_data_index.
|
||||
- unsigned box_count = box_data_list_.size();
|
||||
+ Vector<BoxData> fragmented_boxes;
|
||||
for (unsigned index = 0; index < line_box->size();)
|
||||
- index = UpdateBoxDataFragmentRange(line_box, index);
|
||||
+ index = UpdateBoxDataFragmentRange(line_box, index, &fragmented_boxes);
|
||||
|
||||
- // If any inline fragmentation due to BiDi reorder, adjust box edges.
|
||||
- if (box_count != box_data_list_.size())
|
||||
- UpdateFragmentedBoxDataEdges();
|
||||
+ // If any inline fragmentation occurred due to BiDi reorder, append them and
|
||||
+ // adjust box edges.
|
||||
+ if (UNLIKELY(!fragmented_boxes.IsEmpty()))
|
||||
+ UpdateFragmentedBoxDataEdges(&fragmented_boxes);
|
||||
|
||||
#if DCHECK_IS_ON()
|
||||
// Check all BoxData have ranges.
|
||||
@@ -412,7 +414,8 @@ void NGInlineLayoutStateStack::UpdateAfterReorder(
|
||||
|
||||
unsigned NGInlineLayoutStateStack::UpdateBoxDataFragmentRange(
|
||||
NGLogicalLineItems* line_box,
|
||||
- unsigned index) {
|
||||
+ unsigned index,
|
||||
+ Vector<BoxData>* fragmented_boxes) {
|
||||
// Find the first line box item that should create a box fragment.
|
||||
for (; index < line_box->size(); index++) {
|
||||
NGLogicalLineItem* start = &(*line_box)[index];
|
||||
@@ -440,7 +443,7 @@ unsigned NGInlineLayoutStateStack::UpdateBoxDataFragmentRange(
|
||||
// It also changes other BoxData, but not the one we're dealing with here
|
||||
// because the update is limited only when its |box_data_index| is lower.
|
||||
while (end->box_data_index && end->box_data_index < box_data_index) {
|
||||
- UpdateBoxDataFragmentRange(line_box, index);
|
||||
+ UpdateBoxDataFragmentRange(line_box, index, fragmented_boxes);
|
||||
}
|
||||
|
||||
if (box_data_index != end->box_data_index)
|
||||
@@ -455,14 +458,9 @@ unsigned NGInlineLayoutStateStack::UpdateBoxDataFragmentRange(
|
||||
} else {
|
||||
// This box is fragmented by BiDi reordering. Add a new BoxData for the
|
||||
// fragmented range.
|
||||
- box_data_list_[box_data_index - 1].fragmented_box_data_index =
|
||||
- box_data_list_.size();
|
||||
- // Do not use `emplace_back()` here because adding to |box_data_list_| may
|
||||
- // reallocate the buffer, but the `BoxData` ctor must run before the
|
||||
- // reallocation. Create a new instance and |push_back()| instead.
|
||||
- BoxData fragmented_box_data(box_data_list_[box_data_index - 1],
|
||||
- start_index, index);
|
||||
- box_data_list_.push_back(fragmented_box_data);
|
||||
+ BoxData& fragmented_box = fragmented_boxes->emplace_back(
|
||||
+ box_data_list_[box_data_index - 1], start_index, index);
|
||||
+ fragmented_box.fragmented_box_data_index = box_data_index;
|
||||
}
|
||||
// If this box has parent boxes, we need to process it again.
|
||||
if (box_data_list_[box_data_index - 1].parent_box_data_index)
|
||||
@@ -472,7 +470,43 @@ unsigned NGInlineLayoutStateStack::UpdateBoxDataFragmentRange(
|
||||
return index;
|
||||
}
|
||||
|
||||
-void NGInlineLayoutStateStack::UpdateFragmentedBoxDataEdges() {
|
||||
+void NGInlineLayoutStateStack::UpdateFragmentedBoxDataEdges(
|
||||
+ Vector<BoxData>* fragmented_boxes) {
|
||||
+ DCHECK(!fragmented_boxes->IsEmpty());
|
||||
+ // Append in the descending order of |fragmented_box_data_index| because the
|
||||
+ // indices will change as boxes are inserted into |box_data_list_|.
|
||||
+ std::sort(fragmented_boxes->begin(), fragmented_boxes->end(),
|
||||
+ [](const BoxData& a, const BoxData& b) {
|
||||
+ if (a.fragmented_box_data_index != b.fragmented_box_data_index) {
|
||||
+ return a.fragmented_box_data_index <
|
||||
+ b.fragmented_box_data_index;
|
||||
+ }
|
||||
+ DCHECK_NE(a.fragment_start, b.fragment_start);
|
||||
+ return a.fragment_start < b.fragment_start;
|
||||
+ });
|
||||
+ for (BoxData& fragmented_box : base::Reversed(*fragmented_boxes)) {
|
||||
+ // Insert the fragmented box to right after the box it was fragmented from.
|
||||
+ // The order in the |box_data_list_| is critical when propagating child
|
||||
+ // fragment data such as OOF to ancestors.
|
||||
+ const unsigned insert_at = fragmented_box.fragmented_box_data_index;
|
||||
+ DCHECK_GT(insert_at, 0u);
|
||||
+ fragmented_box.fragmented_box_data_index = 0;
|
||||
+ box_data_list_.insert(insert_at, fragmented_box);
|
||||
+
|
||||
+ // Adjust box data indices by the insertion.
|
||||
+ for (BoxData& box_data : box_data_list_) {
|
||||
+ if (box_data.fragmented_box_data_index >= insert_at)
|
||||
+ ++box_data.fragmented_box_data_index;
|
||||
+ }
|
||||
+
|
||||
+ // Set the index of the last fragment to the original box. This is needed to
|
||||
+ // update fragment edges.
|
||||
+ const unsigned fragmented_from = insert_at - 1;
|
||||
+ if (!box_data_list_[fragmented_from].fragmented_box_data_index)
|
||||
+ box_data_list_[fragmented_from].fragmented_box_data_index = insert_at;
|
||||
+ }
|
||||
+
|
||||
+ // Move the line-right edge to the last fragment.
|
||||
for (BoxData& box_data : box_data_list_) {
|
||||
if (box_data.fragmented_box_data_index)
|
||||
box_data.UpdateFragmentEdges(box_data_list_);
|
||||
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
|
||||
index 36aa27914a6598671c3f9266f323ab03847db5a6..7fb13383a21116ce1dd17a327ad2cc911c3f7c01 100644
|
||||
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
|
||||
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
|
||||
@@ -157,17 +157,6 @@ class CORE_EXPORT NGInlineLayoutStateStack {
|
||||
// reordering.
|
||||
void UpdateAfterReorder(NGLogicalLineItems*);
|
||||
|
||||
- // Update start/end of the first BoxData found at |index|.
|
||||
- //
|
||||
- // If inline fragmentation is found, a new BoxData is added.
|
||||
- //
|
||||
- // Returns the index to process next. It should be given to the next call to
|
||||
- // this function.
|
||||
- unsigned UpdateBoxDataFragmentRange(NGLogicalLineItems*, unsigned index);
|
||||
-
|
||||
- // Update edges of inline fragmented boxes.
|
||||
- void UpdateFragmentedBoxDataEdges();
|
||||
-
|
||||
// Compute inline positions of fragments and boxes.
|
||||
LayoutUnit ComputeInlinePositions(NGLogicalLineItems*, LayoutUnit position);
|
||||
|
||||
@@ -260,6 +249,19 @@ class CORE_EXPORT NGInlineLayoutStateStack {
|
||||
scoped_refptr<const NGLayoutResult> CreateBoxFragment(NGLogicalLineItems*);
|
||||
};
|
||||
|
||||
+ // Update start/end of the first BoxData found at |index|.
|
||||
+ //
|
||||
+ // If inline fragmentation is found, a new BoxData is added.
|
||||
+ //
|
||||
+ // Returns the index to process next. It should be given to the next call to
|
||||
+ // this function.
|
||||
+ unsigned UpdateBoxDataFragmentRange(NGLogicalLineItems*,
|
||||
+ unsigned index,
|
||||
+ Vector<BoxData>* fragmented_boxes);
|
||||
+
|
||||
+ // Update edges of inline fragmented boxes.
|
||||
+ void UpdateFragmentedBoxDataEdges(Vector<BoxData>* fragmented_boxes);
|
||||
+
|
||||
Vector<NGInlineBoxState, 4> stack_;
|
||||
Vector<BoxData, 4> box_data_list_;
|
||||
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/text/crashtests/bidi-inline-fragment-oof-crash.html b/third_party/blink/web_tests/external/wpt/css/CSS2/text/crashtests/bidi-inline-fragment-oof-crash.html
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b701d2b5688ace54aa99530c12fa8143f1e6a508
|
||||
--- /dev/null
|
||||
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/text/crashtests/bidi-inline-fragment-oof-crash.html
|
||||
@@ -0,0 +1,13 @@
|
||||
+<!DOCTYPE html>
|
||||
+<link rel="author" href="mailto:mstensho@chromium.org">
|
||||
+<link rel="help" href="https://crbug.com/1229999">
|
||||
+<div style="direction:rtl; width:500px">
|
||||
+ <span style="border:solid">
|
||||
+ <span style="position:relative">
|
||||
+ <div style="display:inline-block; width:1000%; height:10px"></div>
|
||||
+ <span dir="ltr">
|
||||
+ <div style="position:absolute"></div>
|
||||
+ </span>
|
||||
+ </span>
|
||||
+ </span>
|
||||
+</div>
|
||||
163
patches/chromium/cherry-pick-1231134.patch
Normal file
163
patches/chromium/cherry-pick-1231134.patch
Normal file
@@ -0,0 +1,163 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lei Zhang <thestig@chromium.org>
|
||||
Date: Tue, 10 Aug 2021 21:38:36 +0000
|
||||
Subject: Do more class validity checks in PrintViewManagerBase.
|
||||
|
||||
PrintViewManagerBase runs a nested loop. In some situations,
|
||||
PrintViewManagerBase and related classes like PrintViewManager and
|
||||
PrintPreviewHandler can get deleted while the nested loop is running.
|
||||
When this happens, the nested loop exists to a PrintViewManagerBase
|
||||
that is no longer valid.
|
||||
|
||||
Use base::WeakPtrs liberally to check for this condition and exit
|
||||
safely.
|
||||
|
||||
(cherry picked from commit a2cb1fb333d2faacb2fe1380f8d2621b5ee6af7e)
|
||||
|
||||
Bug: 1231134
|
||||
Change-Id: I21ec131574331ce973d22594c11e70088147e149
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3057880
|
||||
Reviewed-by: Alan Screen <awscreen@chromium.org>
|
||||
Commit-Queue: Lei Zhang <thestig@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/master@{#906269}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3086110
|
||||
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
|
||||
Cr-Commit-Position: refs/branch-heads/4515@{#2024}
|
||||
Cr-Branched-From: 488fc70865ddaa05324ac00a54a6eb783b4bc41c-refs/heads/master@{#885287}
|
||||
|
||||
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
|
||||
index b7a2fa5a10b2461e83d78fca63e3165d5eb1350f..9f11d5053ff19e4ccfdbe54e7f59e311da3c6e0a 100644
|
||||
--- a/chrome/browser/printing/print_view_manager.cc
|
||||
+++ b/chrome/browser/printing/print_view_manager.cc
|
||||
@@ -91,7 +91,11 @@ bool PrintViewManager::PrintForSystemDialogNow(
|
||||
DCHECK(!on_print_dialog_shown_callback_);
|
||||
on_print_dialog_shown_callback_ = std::move(dialog_shown_callback);
|
||||
is_switching_to_system_dialog_ = true;
|
||||
+
|
||||
+ auto weak_this = weak_factory_.GetWeakPtr();
|
||||
DisconnectFromCurrentPrintJob();
|
||||
+ if (!weak_this)
|
||||
+ return false;
|
||||
|
||||
// Don't print / print preview crashed tabs.
|
||||
if (IsCrashed())
|
||||
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h
|
||||
index 8770b7bc60cb28d70cde3af8303939bf7ac27892..16c13724c397fade0eb64f9b5ec26c7bf51570ac 100644
|
||||
--- a/chrome/browser/printing/print_view_manager.h
|
||||
+++ b/chrome/browser/printing/print_view_manager.h
|
||||
@@ -130,6 +130,11 @@ class PrintViewManager : public PrintViewManagerBase,
|
||||
|
||||
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
||||
|
||||
+ // Keep this last so that all weak pointers will be invalidated at the
|
||||
+ // beginning of destruction. Note that PrintViewManagerBase has its own
|
||||
+ // base::WeakPtrFactory as well, but PrintViewManager should use this one.
|
||||
+ base::WeakPtrFactory<PrintViewManager> weak_factory_{this};
|
||||
+
|
||||
DISALLOW_COPY_AND_ASSIGN(PrintViewManager);
|
||||
};
|
||||
|
||||
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
|
||||
index 75908fc9978db020d752e7fc7211d1a075c11ffb..b896f69f3ec272001c5c6c0071bc23a3c9134d70 100644
|
||||
--- a/chrome/browser/printing/print_view_manager_base.cc
|
||||
+++ b/chrome/browser/printing/print_view_manager_base.cc
|
||||
@@ -192,7 +192,10 @@ bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh,
|
||||
bool silent,
|
||||
base::Value settings,
|
||||
CompletionCallback callback) {
|
||||
+ auto weak_this = weak_ptr_factory_.GetWeakPtr();
|
||||
DisconnectFromCurrentPrintJob();
|
||||
+ if (!weak_this)
|
||||
+ return false;
|
||||
|
||||
// Don't print / print preview crashed tabs.
|
||||
if (IsCrashed())
|
||||
@@ -625,6 +628,8 @@ bool PrintViewManagerBase::RenderAllMissingPagesNow() {
|
||||
// or in DidPrintDocument(). The check is done in
|
||||
// ShouldQuitFromInnerMessageLoop().
|
||||
// BLOCKS until all the pages are received. (Need to enable recursive task)
|
||||
+ // WARNING: Do not do any work after RunInnerMessageLoop() returns, as `this`
|
||||
+ // may have gone away.
|
||||
if (!RunInnerMessageLoop()) {
|
||||
// This function is always called from DisconnectFromCurrentPrintJob() so we
|
||||
// know that the job will be stopped/canceled in any case.
|
||||
@@ -651,8 +656,11 @@ bool PrintViewManagerBase::CreateNewPrintJob(
|
||||
DCHECK(query);
|
||||
|
||||
if (callback_.is_null()) {
|
||||
+ auto weak_this = weak_ptr_factory_.GetWeakPtr();
|
||||
// Disconnect the current |print_job_| only when calling window.print()
|
||||
DisconnectFromCurrentPrintJob();
|
||||
+ if (!weak_this)
|
||||
+ return false;
|
||||
}
|
||||
|
||||
// We can't print if there is no renderer.
|
||||
@@ -681,7 +689,10 @@ bool PrintViewManagerBase::CreateNewPrintJob(
|
||||
void PrintViewManagerBase::DisconnectFromCurrentPrintJob() {
|
||||
// Make sure all the necessary rendered page are done. Don't bother with the
|
||||
// return value.
|
||||
+ auto weak_this = weak_ptr_factory_.GetWeakPtr();
|
||||
bool result = RenderAllMissingPagesNow();
|
||||
+ if (!weak_this)
|
||||
+ return;
|
||||
|
||||
// Verify that assertion.
|
||||
if (print_job_ && print_job_->document() &&
|
||||
@@ -763,7 +774,10 @@ bool PrintViewManagerBase::RunInnerMessageLoop() {
|
||||
|
||||
quit_inner_loop_ = run_loop.QuitClosure();
|
||||
|
||||
+ auto weak_this = weak_ptr_factory_.GetWeakPtr();
|
||||
run_loop.Run();
|
||||
+ if (!weak_this)
|
||||
+ return false;
|
||||
|
||||
// If the inner-loop quit closure is still set then we timed out.
|
||||
bool success = !quit_inner_loop_;
|
||||
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h
|
||||
index 095d9dfcc3ee14b646b63c29e406434c1623704a..ed4c0ec98bb84753828d0649799077edc9796317 100644
|
||||
--- a/chrome/browser/printing/print_view_manager_base.h
|
||||
+++ b/chrome/browser/printing/print_view_manager_base.h
|
||||
@@ -115,6 +115,8 @@ class PrintViewManagerBase : public content::NotificationObserver,
|
||||
|
||||
// Makes sure the current print_job_ has all its data before continuing, and
|
||||
// disconnect from it.
|
||||
+ // WARNING: `this` may not be alive after DisconnectFromCurrentPrintJob()
|
||||
+ // returns.
|
||||
void DisconnectFromCurrentPrintJob();
|
||||
|
||||
// Manages the low-level talk to the printer.
|
||||
@@ -168,6 +170,7 @@ class PrintViewManagerBase : public content::NotificationObserver,
|
||||
// Requests the RenderView to render all the missing pages for the print job.
|
||||
// No-op if no print job is pending. Returns true if at least one page has
|
||||
// been requested to the renderer.
|
||||
+ // WARNING: `this` may not be alive after RenderAllMissingPagesNow() returns.
|
||||
bool RenderAllMissingPagesNow();
|
||||
|
||||
// Checks that synchronization is correct with |print_job_| based on |cookie|.
|
||||
@@ -201,6 +204,7 @@ class PrintViewManagerBase : public content::NotificationObserver,
|
||||
// while the blocking inner message loop is running. This is useful in cases
|
||||
// where the RenderView is about to be destroyed while a printing job isn't
|
||||
// finished.
|
||||
+ // WARNING: `this` may not be alive after RunInnerMessageLoop() returns.
|
||||
bool RunInnerMessageLoop();
|
||||
|
||||
// In the case of Scripted Printing, where the renderer is controlling the
|
||||
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
|
||||
index 2cea700c82790f696775ece3080662232326aabc..ab89b180e6f9586d6280d884f126fb46b278be04 100644
|
||||
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
|
||||
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
|
||||
@@ -864,9 +864,12 @@ void PrintPreviewHandler::HandleShowSystemDialog(
|
||||
if (!initiator)
|
||||
return;
|
||||
|
||||
+ auto weak_this = weak_factory_.GetWeakPtr();
|
||||
auto* print_view_manager = PrintViewManager::FromWebContents(initiator);
|
||||
print_view_manager->PrintForSystemDialogNow(base::BindOnce(
|
||||
&PrintPreviewHandler::ClosePreviewDialog, weak_factory_.GetWeakPtr()));
|
||||
+ if (!weak_this)
|
||||
+ return;
|
||||
|
||||
// Cancel the pending preview request if exists.
|
||||
print_preview_ui()->OnCancelPendingPreviewRequest();
|
||||
77
patches/chromium/cherry-pick-1233564.patch
Normal file
77
patches/chromium/cherry-pick-1233564.patch
Normal file
@@ -0,0 +1,77 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hongchan Choi <hongchan@chromium.org>
|
||||
Date: Mon, 9 Aug 2021 18:43:22 +0000
|
||||
Subject: Protect HRTF database loader thread from access by different threads
|
||||
|
||||
This patch add a new mutex locker around the HRTF database loader
|
||||
thread to ensure the safe exclusive access of the loader thread
|
||||
and the HRTF database.
|
||||
|
||||
(cherry picked from commit 6811e850ee10847da16c4d5fdc0f845494586b65)
|
||||
|
||||
Bug: 1233564
|
||||
Change-Id: Ie12b99ffe520d3747e34af387a37637a10aab38a
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3068260
|
||||
Auto-Submit: Hongchan Choi <hongchan@chromium.org>
|
||||
Commit-Queue: Kentaro Hara <haraken@chromium.org>
|
||||
Reviewed-by: Kentaro Hara <haraken@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/master@{#908269}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3082114
|
||||
Reviewed-by: Chris Mumford <cmumford@google.com>
|
||||
Commit-Queue: Hongchan Choi <hongchan@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/4577@{#601}
|
||||
Cr-Branched-From: 761ddde228655e313424edec06497d0c56b0f3c4-refs/heads/master@{#902210}
|
||||
|
||||
diff --git a/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc b/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
|
||||
index 034ded03d11fa42f0d0f62c6a91f6e20ee5f93e1..01cb98a1116fe1eb6a13ff6345b6bdf4e136badc 100644
|
||||
--- a/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
|
||||
+++ b/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
|
||||
@@ -86,6 +86,8 @@ void HRTFDatabaseLoader::LoadTask() {
|
||||
void HRTFDatabaseLoader::LoadAsynchronously() {
|
||||
DCHECK(IsMainThread());
|
||||
|
||||
+ MutexLocker locker(lock_);
|
||||
+
|
||||
// m_hrtfDatabase and m_thread should both be unset because this should be a
|
||||
// new HRTFDatabaseLoader object that was just created by
|
||||
// createAndLoadAsynchronouslyIfNecessary and because we haven't started
|
||||
@@ -122,6 +124,10 @@ void HRTFDatabaseLoader::CleanupTask(base::WaitableEvent* sync) {
|
||||
}
|
||||
|
||||
void HRTFDatabaseLoader::WaitForLoaderThreadCompletion() {
|
||||
+ // We can lock this because this is called from either the main thread or
|
||||
+ // the offline audio rendering thread.
|
||||
+ MutexLocker locker(lock_);
|
||||
+
|
||||
if (!thread_)
|
||||
return;
|
||||
|
||||
diff --git a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
|
||||
index 3ce476fa68e066d6faf40011e94203f0fb778e71..a94997b4f7e06f96018187967faa524d4acfd5f6 100644
|
||||
--- a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
|
||||
+++ b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
|
||||
@@ -64,8 +64,8 @@ class PLATFORM_EXPORT HRTFDatabaseLoader final
|
||||
// must be called from the audio thread.
|
||||
bool IsLoaded() { return Database(); }
|
||||
|
||||
- // waitForLoaderThreadCompletion() may be called more than once and is
|
||||
- // thread-safe.
|
||||
+ // May be called from both main and audio thread, and also can be called more
|
||||
+ // than once.
|
||||
void WaitForLoaderThreadCompletion();
|
||||
|
||||
// Returns the database or nullptr if the database doesn't yet exist. Must
|
||||
@@ -87,11 +87,10 @@ class PLATFORM_EXPORT HRTFDatabaseLoader final
|
||||
void LoadTask();
|
||||
void CleanupTask(base::WaitableEvent*);
|
||||
|
||||
- // Holding a m_lock is required when accessing m_hrtfDatabase since we access
|
||||
- // it from multiple threads.
|
||||
+ // |lock_| MUST be held when accessing |hrtf_database_| or |thread_| because
|
||||
+ // it can be accessed by multiple threads (e.g multiple AudioContexts).
|
||||
Mutex lock_;
|
||||
std::unique_ptr<HRTFDatabase> hrtf_database_;
|
||||
-
|
||||
std::unique_ptr<Thread> thread_;
|
||||
|
||||
float database_sample_rate_;
|
||||
138
patches/chromium/cherry-pick-1234009.patch
Normal file
138
patches/chromium/cherry-pick-1234009.patch
Normal file
@@ -0,0 +1,138 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Sam McNally <sammc@chromium.org>
|
||||
Date: Tue, 10 Aug 2021 02:14:43 +0000
|
||||
Subject: Defer looking up the WebContents for the directory confirmation
|
||||
dialog.
|
||||
|
||||
Look up the WebContents to use for the sensitive directory confirmation
|
||||
dialog immediately before it's used instead of before performing some
|
||||
blocking file access to determine whether it's necessary.
|
||||
|
||||
(cherry picked from commit 18236a0db8341302120c60781ae3129e94fbaf1c)
|
||||
|
||||
Bug: 1234009
|
||||
Change-Id: I5e00c7fa199b3da522e1fdb73242891d7f5f7423
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3063743
|
||||
Reviewed-by: Alex Danilo <adanilo@chromium.org>
|
||||
Reviewed-by: Ben Wells <benwells@chromium.org>
|
||||
Commit-Queue: Sam McNally <sammc@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/master@{#907467}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3083204
|
||||
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
|
||||
Cr-Commit-Position: refs/branch-heads/4577@{#648}
|
||||
Cr-Branched-From: 761ddde228655e313424edec06497d0c56b0f3c4-refs/heads/master@{#902210}
|
||||
|
||||
diff --git a/extensions/browser/api/file_system/file_system_api.cc b/extensions/browser/api/file_system/file_system_api.cc
|
||||
index a128893387beac06fb1256416ae234af251378db..870298116be17a2bb0874f8b32c8926ec19ed0d4 100644
|
||||
--- a/extensions/browser/api/file_system/file_system_api.cc
|
||||
+++ b/extensions/browser/api/file_system/file_system_api.cc
|
||||
@@ -196,6 +196,9 @@ void PassFileInfoToUIThread(FileInfoOptCallback callback,
|
||||
content::WebContents* GetWebContentsForRenderFrameHost(
|
||||
content::BrowserContext* browser_context,
|
||||
content::RenderFrameHost* render_frame_host) {
|
||||
+ if (!render_frame_host)
|
||||
+ return nullptr;
|
||||
+
|
||||
content::WebContents* web_contents =
|
||||
content::WebContents::FromRenderFrameHost(render_frame_host);
|
||||
// Check if there is an app window associated with the web contents; if not,
|
||||
@@ -508,15 +511,6 @@ void FileSystemChooseEntryFunction::FilesSelected(
|
||||
}
|
||||
|
||||
if (is_directory_) {
|
||||
- // Get the WebContents for the app window to be the parent window of the
|
||||
- // confirmation dialog if necessary.
|
||||
- content::WebContents* const web_contents = GetWebContentsForRenderFrameHost(
|
||||
- browser_context(), render_frame_host());
|
||||
- if (!web_contents) {
|
||||
- Respond(Error(kInvalidCallingPage));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
DCHECK_EQ(paths.size(), 1u);
|
||||
bool non_native_path = false;
|
||||
#if defined(OS_CHROMEOS)
|
||||
@@ -530,7 +524,7 @@ void FileSystemChooseEntryFunction::FilesSelected(
|
||||
FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
|
||||
base::BindOnce(
|
||||
&FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync, this,
|
||||
- non_native_path, paths, web_contents));
|
||||
+ non_native_path, paths));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -543,8 +537,7 @@ void FileSystemChooseEntryFunction::FileSelectionCanceled() {
|
||||
|
||||
void FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync(
|
||||
bool non_native_path,
|
||||
- const std::vector<base::FilePath>& paths,
|
||||
- content::WebContents* web_contents) {
|
||||
+ const std::vector<base::FilePath>& paths) {
|
||||
const base::FilePath check_path =
|
||||
non_native_path ? paths[0] : base::MakeAbsoluteFilePath(paths[0]);
|
||||
if (check_path.empty()) {
|
||||
@@ -576,7 +569,7 @@ void FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync(
|
||||
FROM_HERE,
|
||||
base::BindOnce(
|
||||
&FileSystemChooseEntryFunction::ConfirmSensitiveDirectoryAccess,
|
||||
- this, paths, web_contents));
|
||||
+ this, paths));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -587,8 +580,7 @@ void FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync(
|
||||
}
|
||||
|
||||
void FileSystemChooseEntryFunction::ConfirmSensitiveDirectoryAccess(
|
||||
- const std::vector<base::FilePath>& paths,
|
||||
- content::WebContents* web_contents) {
|
||||
+ const std::vector<base::FilePath>& paths) {
|
||||
if (ExtensionsBrowserClient::Get()->IsShuttingDown()) {
|
||||
FileSelectionCanceled();
|
||||
return;
|
||||
@@ -601,6 +593,13 @@ void FileSystemChooseEntryFunction::ConfirmSensitiveDirectoryAccess(
|
||||
return;
|
||||
}
|
||||
|
||||
+ content::WebContents* const web_contents =
|
||||
+ GetWebContentsForRenderFrameHost(browser_context(), render_frame_host());
|
||||
+ if (!web_contents) {
|
||||
+ Respond(Error(kInvalidCallingPage));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
delegate->ConfirmSensitiveDirectoryAccess(
|
||||
app_file_handler_util::HasFileSystemWritePermission(extension_.get()),
|
||||
base::UTF8ToUTF16(extension_->name()), web_contents,
|
||||
diff --git a/extensions/browser/api/file_system/file_system_api.h b/extensions/browser/api/file_system/file_system_api.h
|
||||
index 2a95c4d89fd2746aec0792f231bd20eac1b82d63..95ae48b3338ca90c25c098cd23655a84236aa6e6 100644
|
||||
--- a/extensions/browser/api/file_system/file_system_api.h
|
||||
+++ b/extensions/browser/api/file_system/file_system_api.h
|
||||
@@ -18,10 +18,6 @@
|
||||
#include "extensions/common/api/file_system.h"
|
||||
#include "ui/shell_dialogs/select_file_dialog.h"
|
||||
|
||||
-namespace content {
|
||||
-class WebContents;
|
||||
-} // namespace content
|
||||
-
|
||||
namespace extensions {
|
||||
class ExtensionPrefs;
|
||||
|
||||
@@ -167,13 +163,12 @@ class FileSystemChooseEntryFunction : public FileSystemEntryFunction {
|
||||
// directory. If so, calls ConfirmSensitiveDirectoryAccess. Otherwise, calls
|
||||
// OnDirectoryAccessConfirmed.
|
||||
void ConfirmDirectoryAccessAsync(bool non_native_path,
|
||||
- const std::vector<base::FilePath>& paths,
|
||||
- content::WebContents* web_contents);
|
||||
+ const std::vector<base::FilePath>& paths);
|
||||
|
||||
// Shows a dialog to confirm whether the user wants to open the directory.
|
||||
// Calls OnDirectoryAccessConfirmed or FileSelectionCanceled.
|
||||
- void ConfirmSensitiveDirectoryAccess(const std::vector<base::FilePath>& paths,
|
||||
- content::WebContents* web_contents);
|
||||
+ void ConfirmSensitiveDirectoryAccess(
|
||||
+ const std::vector<base::FilePath>& paths);
|
||||
|
||||
void OnDirectoryAccessConfirmed(const std::vector<base::FilePath>& paths);
|
||||
|
||||
@@ -35,3 +35,4 @@ cherry-pick-fd8cbdf7b888.patch
|
||||
cherry-pick-fd9ce58ecd13.patch
|
||||
merged_json_fix_gc_issue_in_buildjsonobject.patch
|
||||
merged_compiler_fix_a_bug_in.patch
|
||||
cherry-pick-1234764.patch
|
||||
|
||||
43
patches/v8/cherry-pick-1234764.patch
Normal file
43
patches/v8/cherry-pick-1234764.patch
Normal file
@@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Georg Neis <neis@chromium.org>
|
||||
Date: Tue, 10 Aug 2021 09:29:33 +0200
|
||||
Subject: Merged: [compiler] Harden
|
||||
JSCallReducer::ReduceArrayIteratorPrototypeNext
|
||||
|
||||
Revision: 65b20a0e65e1078f5dd230a5203e231bec790ab4
|
||||
|
||||
BUG=chromium:1234764
|
||||
NOTRY=true
|
||||
NOPRESUBMIT=true
|
||||
NOTREECHECKS=true
|
||||
R=vahl@chromium.org
|
||||
|
||||
Change-Id: I45faf253695011092de144c8e29bafac5337adec
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3084363
|
||||
Reviewed-by: Lutz Vahl <vahl@chromium.org>
|
||||
Commit-Queue: Georg Neis <neis@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/9.2@{#53}
|
||||
Cr-Branched-From: 51238348f95a1f5e0acc321efac7942d18a687a2-refs/heads/9.2.230@{#1}
|
||||
Cr-Branched-From: 587a04f02ab0487d194b55a7137dc2045e071597-refs/heads/master@{#74656}
|
||||
|
||||
diff --git a/src/compiler/js-call-reducer.cc b/src/compiler/js-call-reducer.cc
|
||||
index b77094b7e1f0c57552fc7c8d3cea1f9d9ed7a269..a34b33e3a88b72f3ef6ca665f67cf3e9c7fff173 100644
|
||||
--- a/src/compiler/js-call-reducer.cc
|
||||
+++ b/src/compiler/js-call-reducer.cc
|
||||
@@ -5826,11 +5826,12 @@ Reduction JSCallReducer::ReduceArrayIteratorPrototypeNext(Node* node) {
|
||||
Node* etrue = effect;
|
||||
Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
||||
{
|
||||
- // We know that the {index} is range of the {length} now.
|
||||
+ // This extra check exists to refine the type of {index} but also to break
|
||||
+ // an exploitation technique that abuses typer mismatches.
|
||||
index = etrue = graph()->NewNode(
|
||||
- common()->TypeGuard(
|
||||
- Type::Range(0.0, length_access.type.Max() - 1.0, graph()->zone())),
|
||||
- index, etrue, if_true);
|
||||
+ simplified()->CheckBounds(p.feedback(),
|
||||
+ CheckBoundsFlag::kAbortOnOutOfBounds),
|
||||
+ index, length, etrue, if_true);
|
||||
|
||||
done_true = jsgraph()->FalseConstant();
|
||||
if (iteration_kind == IterationKind::kKeys) {
|
||||
@@ -50,8 +50,8 @@ END
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 11,4,12,0
|
||||
PRODUCTVERSION 11,4,12,0
|
||||
FILEVERSION 11,5,0,0
|
||||
PRODUCTVERSION 11,5,0,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -68,12 +68,12 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "GitHub, Inc."
|
||||
VALUE "FileDescription", "Electron"
|
||||
VALUE "FileVersion", "11.4.12"
|
||||
VALUE "FileVersion", "11.5.0"
|
||||
VALUE "InternalName", "electron.exe"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved."
|
||||
VALUE "OriginalFilename", "electron.exe"
|
||||
VALUE "ProductName", "Electron"
|
||||
VALUE "ProductVersion", "11.4.12"
|
||||
VALUE "ProductVersion", "11.5.0"
|
||||
VALUE "SquirrelAwareVersion", "1"
|
||||
END
|
||||
END
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/win/scoped_com_initializer.h"
|
||||
#include "shell/common/gin_converters/image_converter.h"
|
||||
#include "shell/common/gin_helper/promise.h"
|
||||
#include "shell/common/skia_util.h"
|
||||
@@ -26,6 +27,8 @@ v8::Local<v8::Promise> NativeImage::CreateThumbnailFromPath(
|
||||
v8::Isolate* isolate,
|
||||
const base::FilePath& path,
|
||||
const gfx::Size& size) {
|
||||
base::win::ScopedCOMInitializer scoped_com_initializer;
|
||||
|
||||
gin_helper::Promise<gfx::Image> promise(isolate);
|
||||
v8::Local<v8::Promise> handle = promise.GetHandle();
|
||||
HRESULT hr;
|
||||
|
||||
Reference in New Issue
Block a user