blob: edde52c23bd16f133574712c90bdbb809dd9c60e [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file tests the chrome.runtime extension API.
#include "extensions/browser/api/runtime/runtime_api.h"
#include <string>
#include "extensions/browser/api_unittest.h"
#include "extensions/browser/extension_prefs.h"
namespace extensions {
class ExtensionRuntimeTest : public ApiUnitTest {
protected:
using ApiUnitTest::RunFunction;
// Call runtime.setUninstallURL() and verify that the call succeeds and
// the pref store is updated.
void SetUninstallURL(const std::string& url) {
RunFunction(base::MakeRefCounted<RuntimeSetUninstallURLFunction>(),
"[\"" + url + "\"]");
// Verify that the URL was properly written to the pref store.
EXPECT_EQ(url, GetUninstallURL());
}
// Call runtime.setUninstallURL() and verify that the call throws an error and
// the pref store is not affected.
void SetUninstallURLError(const std::string& url) {
std::string original_url = GetUninstallURL();
EXPECT_EQ("Invalid URL: \"" + url + "\".",
RunFunctionAndReturnError(
base::MakeRefCounted<RuntimeSetUninstallURLFunction>(),
"[\"" + url + "\"]"));
// Verify that the pref store was not affected.
EXPECT_EQ(original_url, GetUninstallURL());
}
std::string GetUninstallURL() {
std::string url;
ExtensionPrefs::Get(browser_context())
->ReadPrefAsString(extension()->id(), "uninstall_url", &url);
return url;
}
};
TEST_F(ExtensionRuntimeTest, SetUninstallURL) {
// By default extensions should have no uninstall URLs.
EXPECT_EQ("", GetUninstallURL());
SetUninstallURL("https://example.com");
// Empty URL string is accepted (to remove uninstall URL).
SetUninstallURL("");
// URL parameters are accepted.
SetUninstallURL("https://example.com/abcd?param=efg");
// Trailing spaces are accepted.
SetUninstallURL("https://other.example.com/page ");
// Leading spaces are accepted.
SetUninstallURL(" https://other.example.com/some_page");
// HTTP URLs are accepted.
SetUninstallURL("http://insecure.example/path");
// Ensure that only HTTP and HTTPS resources are accepted.
SetUninstallURLError("ws://impossible");
SetUninstallURLError("wss://impossible");
SetUninstallURLError("about:blank");
SetUninstallURLError("chrome://settings");
SetUninstallURLError("://example.com");
}
} // namespace extensions