* chore: bump chromium in DEPS to 97.0.4678.0 * chore: bump chromium in DEPS to 97.0.4679.0 * chore: bump chromium in DEPS to 97.0.4680.0 * chore: bump chromium in DEPS to 97.0.4681.0 * chore: bump chromium in DEPS to 97.0.4682.0 * chore: update patches * 3234737: Disable -Wunused-but-set-variable Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3234737 * 3216953: Reland "Move task-related files from base/ to base/task/" Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3216953 * 3202710: TimeDelta factory function migration. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3202710 * 3226841: Rename WCO::RenderProcessGone to PrimaryMainFrameRenderProcessGone Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3226841 * 3212165: blink/gin: changes blink to load snapshot based on runtime information Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3212165 * 3220292: Deprecate returning a GURL from GURL::GetOrigin() Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3220292 * 3231995: build: Enable -Wbitwise-instead-of-logical everywhere except iOS and Windows Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3231995 * 3205121: Remove base::DictionaryValue::GetDouble Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3205121 * 3208413: [flags] Make --js-flags settings have priority over V8 features Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3208413 * chore: bump chromium in DEPS to 97.0.4683.0 * chore: update patches * 3188834: Combine RWHVBase GetCurrentDeviceScaleFactor/GetDeviceScaleFactor Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3188834 * chore: update process_singleton patches * chore: bump chromium in DEPS to 97.0.4684.0 * chore: update patches * chore: bump chromium in DEPS to 97.0.4685.0 * chore: update patches * chore: bump chromium in DEPS to 97.0.4686.0 * chore: update patches * chore: bump chromium in DEPS to 97.0.4687.0 * chore: update patches * chore: bump chromium in DEPS to 97.0.4688.0 * chore: update patches * 3247722: Use correct source_site_instance if navigating via context menu Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3247722 Update signature of HandleContextMenu() * 3247722: Use correct source_site_instance if navigating via context menu Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3247722 Update signature of HandleContextMenu() * 3223422: Remove PP_ISOLATEDFILESYSTEMTYPE_PRIVATE_PLUGINPRIVATE enum option Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3223422 sync pepper_plugin_support.patch with upstream * chore: bump chromium in DEPS to 97.0.4689.0 * 3247791: ax_mac_merge: Merge AX Math attribute implementations Xref: ax_mac_merge: Merge AX Math attribute implementations chore: fix minor patch shear in #includes * 3243425: Add VisibleTimeRequestTrigger helper class Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3243425 chore: fix minor patch shear in #includes * chore: regen chromium patches * fixup! 3247722: Use correct source_site_instance if navigating via context menu * chore: bump chromium in DEPS to 97.0.4690.0 * 3188659: Window Placement: make GetScreenInfo(s) const Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3188659 simple sync GetScreenInfo with upstream refactor * chore: update patches * chore: bump chromium in DEPS to 97.0.4690.4 * chore: bump chromium in DEPS to 97.0.4692.0 * 3198073: ozone: //content: clean up from USE_X11 Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3198073 Fixing patch shear. Nothing to see here. * 3252338: Remove label images checkbox from chrome://accessibility page Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3252338 Part of our a11y patch is no longer needed due to upstream label removal * 3258183: Remove DISALLOW_IMPLICIT_CONSTRUCTORS() definition Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3258183 Replace our use of the macro with explicitly-deleted class methods. See https://chromium-review.googlesource.com/c/chromium/src/+/3256952 for upstream examples of this same replacement. * chore: update patches * 3247295: Unwind SecurityStyleExplanations Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3247295 update GetSecurityStyle() signature and impl to match upstream changes * 3259578: media: grabs lock to ensure video output when occluded Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3259578 Add stub for new upstream virtual method OnCapturerCountChanged() * fixup! 3247295: Unwind SecurityStyleExplanations * 3238504: Fix up drag image is not shown from bookmark bar Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3238504 SetDragImage() no longer takes a widget argument * 3217452: [devtools] Add getSyncInformation host binding Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3217452 Add stub for new upstream method GetSyncInformation(). Stub sends info back to caller saying that syncing is disabled. * chore: bump chromium in DEPS to 98.0.4693.0 * chore: bump chromium in DEPS to 98.0.4694.0 * chore: bump chromium in DEPS to 98.0.4695.0 * chore: bump chromium in DEPS to 98.0.4696.0 * chore: bump chromium in DEPS to 98.0.4697.0 * chore: bump chromium in DEPS to 98.0.4699.0 * chore: bump chromium in DEPS to 98.0.4701.0 * chore: bump chromium in DEPS to 98.0.4703.0 * chore: bump chromium in DEPS to 98.0.4705.0 * chore: bump chromium in DEPS to 98.0.4706.0 * chore: update patches * 3279210: Rename "base/macros.h" => "base/ignore_result.h" https://chromium-review.googlesource.com/c/chromium/src/+/3279210 * 3259964: Remove all DISALLOW_COPY_AND_ASSIGNs https://chromium-review.googlesource.com/c/chromium/src/+/3259964 * 3269029: blink/gin: sets histogram callbacks during isolate creation https://chromium-review.googlesource.com/c/chromium/src/+/3269029 * fixup after rebase * [content] Make ContentMainParams and MainFunctionParams move-only https://chromium-review.googlesource.com/c/chromium/src/+/3244976 * 3255305: Stop sending the securityStateChanged event and unwind https://chromium-review.googlesource.com/c/chromium/src/+/3255305 * [Blink] Add promise support to WebLocalFrame::RequestExecuteScript() https://chromium-review.googlesource.com/c/chromium/src/+/3230010 * 3256162: Simplify RWHV Show and ShowWithVisibility handling https://chromium-review.googlesource.com/c/chromium/src/+/3256162 * 3263824: ozone: //ui/base: clean up from USE_X11 1/* https://chromium-review.googlesource.com/c/chromium/src/+/3263824 * Request or cancel RecordContentToPresentationTimeRequest during capture https://chromium-review.googlesource.com/c/chromium/src/+/3256802 * appcache: remove BrowsingData/quota references https://chromium-review.googlesource.com/c/chromium/src/+/3255725 * [Autofill] Don't show Autofill dropdown if overlaps with permissions https://chromium-review.googlesource.com/c/chromium/src/+/3236729 * Rename to_different_document to should_show_loading_ui in LoadingStateChanged() callbacks https://chromium-review.googlesource.com/c/chromium/src/+/3268574 * cleanup patch * fixup [content] Make ContentMainParams and MainFunctionParams move-only * 3279210: Rename "base/macros.h" => "base/ignore_result.h" https://chromium-review.googlesource.com/c/chromium/src/+/3279210 * ozone: //chrome/browser clean up from USE_X11 https://chromium-review.googlesource.com/c/chromium/src/+/3186490 Refs: https://github.com/electron/electron/issues/31382 * chore: update support_mixed_sandbox_with_zygote.patch * Enable -Wunused-but-set-variable. Refs https://chromium-review.googlesource.com/c/chromium/src/+/3234737 * fixup! ozone: //ui/base: clean up from USE_X11 1/* * fixup! ozone: //chrome/browser clean up from USE_X11 * chore: fix deprecation warning in libuv * chore: fixup for lint * 3251161: Reland "Make the Clang update.py script require Python 3" https://chromium-review.googlesource.com/c/chromium/src/+/3251161 * fixup: Enable -Wunused-but-set-variable. * [base][win] Rename DIR_APP_DATA to DIR_ROAMING_APP_DATA https://chromium-review.googlesource.com/c/chromium/src/+/3262369 * Replace sandbox::policy::SandboxType with mojom Sandbox enum https://chromium-review.googlesource.com/c/chromium/src/+/3213677 * fixup: [content] Make ContentMainParams and MainFunctionParams move-only * build: ensure angle has a full git checkout available to it * fixup: [base][win] Rename DIR_APP_DATA to DIR_ROAMING_APP_DATA * fixup lint * [unseasoned-pdf] Dispatch 'afterprint' event in PDF plugin frame https://chromium-review.googlesource.com/c/chromium/src/+/3223434 * fixup: [Autofill] Don't show Autofill dropdown if overlaps with permissions * 3217591: Move browser UI CSS color parsing to own file part 2/2 https://chromium-review.googlesource.com/c/chromium/src/+/3217591 * Make kNoSandboxAndElevatedPrivileges only available to utilities https://chromium-review.googlesource.com/c/chromium/src/+/3276784 * 3211575: [modules] Change ScriptOrModule to custom Struct https://chromium-review.googlesource.com/c/v8/v8/+/3211575 * Address review feedback * chore: update patches * 3211575: [modules] Change ScriptOrModule to custom Struct https://chromium-review.googlesource.com/c/v8/v8/+/3211575 * fix: unused variable compat * chore: remove redundant patch * fixup for 3262517: Re-enable WindowCaptureMacV2 https://chromium-review.googlesource.com/c/chromium/src/+/3262517 * chore: cleanup todo The functions added in https://chromium-review.googlesource.com/c/chromium/src/+/3256802 are not used by offscreen rendering. * fixup: update mas_no_private_api.patch * 3216879: [PA] Make features::kPartitionAllocLazyCommit to be PartitionOptions::LazyCommit Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3216879 Fixes up commit b2f1aca95604ec61649808c846657454097e6935 * chore: cleanup support_mixed_sandbox_with_zygote.patch * test: use window focus event instead of delay to wait for webContents focus Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: VerteDinde <khammond@slack-corp.com> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
		
			
				
	
	
		
			230 lines
		
	
	
	
		
			8.7 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
	
		
			8.7 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2018 The Chromium Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style license that can be
 | 
						|
// found in the LICENSE file.
 | 
						|
 | 
						|
#include "shell/browser/extensions/electron_extension_loader.h"
 | 
						|
 | 
						|
#include <utility>
 | 
						|
 | 
						|
#include "base/auto_reset.h"
 | 
						|
#include "base/bind.h"
 | 
						|
#include "base/files/file_path.h"
 | 
						|
#include "base/files/file_util.h"
 | 
						|
#include "base/logging.h"
 | 
						|
#include "base/strings/string_number_conversions.h"
 | 
						|
#include "base/strings/utf_string_conversions.h"
 | 
						|
#include "base/task/sequenced_task_runner.h"
 | 
						|
#include "base/task/task_runner_util.h"
 | 
						|
#include "base/threading/thread_restrictions.h"
 | 
						|
#include "base/time/time.h"
 | 
						|
#include "extensions/browser/extension_file_task_runner.h"
 | 
						|
#include "extensions/browser/extension_prefs.h"
 | 
						|
#include "extensions/browser/extension_registry.h"
 | 
						|
#include "extensions/browser/pref_names.h"
 | 
						|
#include "extensions/common/error_utils.h"
 | 
						|
#include "extensions/common/file_util.h"
 | 
						|
#include "extensions/common/manifest_constants.h"
 | 
						|
 | 
						|
namespace extensions {
 | 
						|
 | 
						|
using LoadErrorBehavior = ExtensionRegistrar::LoadErrorBehavior;
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
std::pair<scoped_refptr<const Extension>, std::string> LoadUnpacked(
 | 
						|
    const base::FilePath& extension_dir,
 | 
						|
    int load_flags) {
 | 
						|
  // app_shell only supports unpacked extensions.
 | 
						|
  // NOTE: If you add packed extension support consider removing the flag
 | 
						|
  // FOLLOW_SYMLINKS_ANYWHERE below. Packed extensions should not have symlinks.
 | 
						|
  if (!base::DirectoryExists(extension_dir)) {
 | 
						|
    std::string err = "Extension directory not found: " +
 | 
						|
                      base::UTF16ToUTF8(extension_dir.LossyDisplayName());
 | 
						|
    return std::make_pair(nullptr, err);
 | 
						|
  }
 | 
						|
 | 
						|
  // remove _metadata folder. Otherwise, the following warning will be thrown
 | 
						|
  // Cannot load extension with file or directory name _metadata.
 | 
						|
  // Filenames starting with "_" are reserved for use by the system.
 | 
						|
  // see: https://bugs.chromium.org/p/chromium/issues/detail?id=377278
 | 
						|
  base::FilePath metadata_dir = extension_dir.Append(kMetadataFolder);
 | 
						|
  if (base::DirectoryExists(metadata_dir)) {
 | 
						|
    base::DeletePathRecursively(metadata_dir);
 | 
						|
  }
 | 
						|
 | 
						|
  std::string load_error;
 | 
						|
  scoped_refptr<Extension> extension = file_util::LoadExtension(
 | 
						|
      extension_dir, extensions::mojom::ManifestLocation::kCommandLine,
 | 
						|
      load_flags, &load_error);
 | 
						|
  if (!extension.get()) {
 | 
						|
    std::string err = "Loading extension at " +
 | 
						|
                      base::UTF16ToUTF8(extension_dir.LossyDisplayName()) +
 | 
						|
                      " failed with: " + load_error;
 | 
						|
    return std::make_pair(nullptr, err);
 | 
						|
  }
 | 
						|
 | 
						|
  std::string warnings;
 | 
						|
  // Log warnings.
 | 
						|
  if (!extension->install_warnings().empty()) {
 | 
						|
    std::string warning_prefix =
 | 
						|
        "Warnings loading extension at " +
 | 
						|
        base::UTF16ToUTF8(extension_dir.LossyDisplayName());
 | 
						|
 | 
						|
    for (const auto& warning : extension->install_warnings()) {
 | 
						|
      std::string unrecognized_manifest_error = ErrorUtils::FormatErrorMessage(
 | 
						|
          manifest_errors::kUnrecognizedManifestKey, warning.key);
 | 
						|
 | 
						|
      if (warning.message == unrecognized_manifest_error) {
 | 
						|
        // filter kUnrecognizedManifestKey error. This error does not have any
 | 
						|
        // impact e.g: Unrecognized manifest key 'minimum_chrome_version' etc.
 | 
						|
        LOG(WARNING) << warning_prefix << ": " << warning.message;
 | 
						|
      } else {
 | 
						|
        warnings += "  " + warning.message + "\n";
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (warnings != "") {
 | 
						|
      warnings = warning_prefix + ":\n" + warnings;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return std::make_pair(extension, warnings);
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace
 | 
						|
 | 
						|
ElectronExtensionLoader::ElectronExtensionLoader(
 | 
						|
    content::BrowserContext* browser_context)
 | 
						|
    : browser_context_(browser_context),
 | 
						|
      extension_registrar_(browser_context, this) {}
 | 
						|
 | 
						|
ElectronExtensionLoader::~ElectronExtensionLoader() = default;
 | 
						|
 | 
						|
void ElectronExtensionLoader::LoadExtension(
 | 
						|
    const base::FilePath& extension_dir,
 | 
						|
    int load_flags,
 | 
						|
    base::OnceCallback<void(const Extension*, const std::string&)> cb) {
 | 
						|
  base::PostTaskAndReplyWithResult(
 | 
						|
      GetExtensionFileTaskRunner().get(), FROM_HERE,
 | 
						|
      base::BindOnce(&LoadUnpacked, extension_dir, load_flags),
 | 
						|
      base::BindOnce(&ElectronExtensionLoader::FinishExtensionLoad,
 | 
						|
                     weak_factory_.GetWeakPtr(), std::move(cb)));
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::ReloadExtension(const ExtensionId& extension_id) {
 | 
						|
  const Extension* extension = ExtensionRegistry::Get(browser_context_)
 | 
						|
                                   ->GetInstalledExtension(extension_id);
 | 
						|
  // We shouldn't be trying to reload extensions that haven't been added.
 | 
						|
  DCHECK(extension);
 | 
						|
 | 
						|
  // This should always start false since it's only set here, or in
 | 
						|
  // LoadExtensionForReload() as a result of the call below.
 | 
						|
  DCHECK_EQ(false, did_schedule_reload_);
 | 
						|
  base::AutoReset<bool> reset_did_schedule_reload(&did_schedule_reload_, false);
 | 
						|
 | 
						|
  extension_registrar_.ReloadExtension(extension_id, LoadErrorBehavior::kQuiet);
 | 
						|
  if (did_schedule_reload_)
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::UnloadExtension(
 | 
						|
    const ExtensionId& extension_id,
 | 
						|
    extensions::UnloadedExtensionReason reason) {
 | 
						|
  extension_registrar_.RemoveExtension(extension_id, reason);
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::FinishExtensionLoad(
 | 
						|
    base::OnceCallback<void(const Extension*, const std::string&)> cb,
 | 
						|
    std::pair<scoped_refptr<const Extension>, std::string> result) {
 | 
						|
  scoped_refptr<const Extension> extension = result.first;
 | 
						|
  if (extension) {
 | 
						|
    extension_registrar_.AddExtension(extension);
 | 
						|
 | 
						|
    // Write extension install time to ExtensionPrefs. This is required by
 | 
						|
    // WebRequestAPI which calls extensions::ExtensionPrefs::GetInstallTime.
 | 
						|
    //
 | 
						|
    // Implementation for writing the pref was based on
 | 
						|
    // PreferenceAPIBase::SetExtensionControlledPref.
 | 
						|
    {
 | 
						|
      ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser_context_);
 | 
						|
      ExtensionPrefs::ScopedDictionaryUpdate update(
 | 
						|
          extension_prefs, extension.get()->id(),
 | 
						|
          extensions::pref_names::kPrefPreferences);
 | 
						|
      auto preference = update.Create();
 | 
						|
      const base::Time install_time = base::Time::Now();
 | 
						|
      preference->SetString(
 | 
						|
          "install_time", base::NumberToString(install_time.ToInternalValue()));
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  std::move(cb).Run(extension.get(), result.second);
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::FinishExtensionReload(
 | 
						|
    const ExtensionId& old_extension_id,
 | 
						|
    std::pair<scoped_refptr<const Extension>, std::string> result) {
 | 
						|
  scoped_refptr<const Extension> extension = result.first;
 | 
						|
  if (extension) {
 | 
						|
    extension_registrar_.AddExtension(extension);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::PreAddExtension(const Extension* extension,
 | 
						|
                                              const Extension* old_extension) {
 | 
						|
  if (old_extension)
 | 
						|
    return;
 | 
						|
 | 
						|
  // The extension might be disabled if a previous reload attempt failed. In
 | 
						|
  // that case, we want to remove that disable reason.
 | 
						|
  ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser_context_);
 | 
						|
  if (extension_prefs->IsExtensionDisabled(extension->id()) &&
 | 
						|
      extension_prefs->HasDisableReason(extension->id(),
 | 
						|
                                        disable_reason::DISABLE_RELOAD)) {
 | 
						|
    extension_prefs->RemoveDisableReason(extension->id(),
 | 
						|
                                         disable_reason::DISABLE_RELOAD);
 | 
						|
    // Only re-enable the extension if there are no other disable reasons.
 | 
						|
    if (extension_prefs->GetDisableReasons(extension->id()) ==
 | 
						|
        disable_reason::DISABLE_NONE) {
 | 
						|
      extension_prefs->SetExtensionEnabled(extension->id());
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void ElectronExtensionLoader::PostActivateExtension(
 | 
						|
    scoped_refptr<const Extension> extension) {}
 | 
						|
 | 
						|
void ElectronExtensionLoader::PostDeactivateExtension(
 | 
						|
    scoped_refptr<const Extension> extension) {}
 | 
						|
 | 
						|
void ElectronExtensionLoader::LoadExtensionForReload(
 | 
						|
    const ExtensionId& extension_id,
 | 
						|
    const base::FilePath& path,
 | 
						|
    LoadErrorBehavior load_error_behavior) {
 | 
						|
  CHECK(!path.empty());
 | 
						|
 | 
						|
  // TODO(nornagon): we should save whether file access was granted
 | 
						|
  // when loading this extension and retain it here. As is, reloading an
 | 
						|
  // extension will cause the file access permission to be dropped.
 | 
						|
  int load_flags = Extension::FOLLOW_SYMLINKS_ANYWHERE;
 | 
						|
  base::PostTaskAndReplyWithResult(
 | 
						|
      GetExtensionFileTaskRunner().get(), FROM_HERE,
 | 
						|
      base::BindOnce(&LoadUnpacked, path, load_flags),
 | 
						|
      base::BindOnce(&ElectronExtensionLoader::FinishExtensionReload,
 | 
						|
                     weak_factory_.GetWeakPtr(), extension_id));
 | 
						|
  did_schedule_reload_ = true;
 | 
						|
}
 | 
						|
 | 
						|
bool ElectronExtensionLoader::CanEnableExtension(const Extension* extension) {
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
bool ElectronExtensionLoader::CanDisableExtension(const Extension* extension) {
 | 
						|
  // Extensions cannot be disabled by the user.
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool ElectronExtensionLoader::ShouldBlockExtension(const Extension* extension) {
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace extensions
 |