0
Files
src/chrome/browser/extensions/external_install_manager.h
Arthur Sonzogni e98d214c48 DanglingPointer: annotate for unittests base+linux [1/N]
The DanglingPointerDetector is configured only when the test enters the
ContentMain function. See https://crbug.com/1400059

I would like to configure it no matter the kind of test. For this to
happen, we need to annotate every pre-existing dangling pointers.

This patch annotates the ones you can find by running targets depending
on the GoogleTest library.

Statistic:

This adds 1776 new DanglingUntriaged. Among them:
- 1288 are in unittests.
- 488 are in implementation.

To produce those numbers, I used the command:
```bash
git diff annotate-linux origin/main -- "*test*" | grep "DanglingUntriaged" | wc -l
```

This patch has been generated by:

1. Apply the "auto-annotator" patch:
   https://chromium-review.googlesource.com/c/chromium/src/+/4474553

2. Compile the compiler again:
   ```bash
   ./tools/clang/scripts/build.py
   ```

3. List and run all the targets. You can use a bash script like:
   https://docs.google.com/document/d/1AMMERcqy0eafFWopUCHYsIKIKEp3J8DFxqW9UIbzIHo

4. Concatenate output, filter by "Found dangling ptr", sort, remove
   duplicate.

5. Apply the rewriter script from:
   https://github.com/ArthurSonzogni/chrome-dangling-ptr-apply-edit

6. Revert the "auto-annotate" patch.

7. Apply `git cl format`

AX-Relnotes: n/a.
Bug: chromium:1400059
Change-Id: I217d5c0b925da5176fc53baf95919a3690f1e9a3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4570424
Reviewed-by: danakj <danakj@chromium.org>
Owners-Override: danakj <danakj@chromium.org>
Commit-Queue: Arthur Sonzogni <arthursonzogni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1151859}
2023-06-01 15:02:25 +00:00

123 lines
4.3 KiB
C++

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_MANAGER_H_
#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_MANAGER_H_
#include <map>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/extension_id.h"
namespace content {
class BrowserContext;
}
namespace extensions {
class Extension;
class ExtensionPrefs;
class ExternalInstallError;
class ExternalInstallManager : public ExtensionRegistryObserver {
public:
ExternalInstallManager(content::BrowserContext* browser_context,
bool is_first_run);
ExternalInstallManager(const ExternalInstallManager&) = delete;
ExternalInstallManager& operator=(const ExternalInstallManager&) = delete;
~ExternalInstallManager() override;
// Called when the associated profile will be destroyed.
void Shutdown();
// Returns true if prompting for external extensions is enabled.
static bool IsPromptingEnabled();
// Removes the error associated with a given extension.
void RemoveExternalInstallError(const std::string& extension_id);
// Checks if there are any new external extensions to notify the user about.
void UpdateExternalExtensionAlert();
// Given a (presumably just-installed) extension id, mark that extension as
// acknowledged.
void AcknowledgeExternalExtension(const std::string& extension_id);
// Notifies the manager that |external_install_error| has changed its alert
// visibility.
void DidChangeInstallAlertVisibility(
ExternalInstallError* external_install_error,
bool visible);
bool has_currently_visible_install_alert() {
return currently_visible_install_alert_ != nullptr;
}
ExternalInstallError* currently_visible_install_alert_for_testing() const {
return currently_visible_install_alert_;
}
// Returns a mutable copy of the list of global errors for testing purposes.
std::vector<ExternalInstallError*> GetErrorsForTesting();
// Clears the record of shown IDs for testing.
void ClearShownIdsForTesting();
private:
// ExtensionRegistryObserver implementation.
void OnExtensionLoaded(content::BrowserContext* browser_context,
const Extension* extension) override;
void OnExtensionInstalled(content::BrowserContext* browser_context,
const Extension* extension,
bool is_update) override;
void OnExtensionUninstalled(content::BrowserContext* browser_context,
const Extension* extension,
extensions::UninstallReason reason) override;
// Adds a global error informing the user that an external extension was
// installed. If |is_new_profile| is true, then this error is from the first
// time our profile checked for new extensions.
void AddExternalInstallError(const Extension* extension, bool is_new_profile);
// Returns true if this extension is an external one that has yet to be
// marked as acknowledged.
bool IsUnacknowledgedExternalExtension(const Extension& extension) const;
// The associated BrowserContext.
raw_ptr<content::BrowserContext> browser_context_;
// Whether or not this is the first run for the profile.
bool is_first_run_;
// The associated ExtensionPrefs.
raw_ptr<ExtensionPrefs> extension_prefs_;
// The collection of ExternalInstallErrors.
std::map<std::string, std::unique_ptr<ExternalInstallError>> errors_;
// The set of ids of unacknowledged external extensions. Populated at
// initialization, and then updated as extensions are added, removed,
// acknowledged, etc.
std::set<ExtensionId> unacknowledged_ids_;
// The set of ids of extensions that we have warned about in this session.
std::set<ExtensionId> shown_ids_;
// The error that is currently showing an alert dialog/bubble.
raw_ptr<ExternalInstallError, DanglingUntriaged>
currently_visible_install_alert_;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observation_{this};
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_EXTERNAL_INSTALL_MANAGER_H_