Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add about panel customization on Windows #19420

Merged
merged 13 commits into from Aug 12, 2019
8 changes: 4 additions & 4 deletions docs/api/app.md
Expand Up @@ -1166,21 +1166,21 @@ This API must be called after the `ready` event is emitted.

**[Deprecated](modernization/property-updates.md)**

### `app.showAboutPanel()` _macOS_ _Linux_
### `app.showAboutPanel()`

Show the app's about panel options. These options can be overridden with `app.setAboutPanelOptions(options)`.

### `app.setAboutPanelOptions(options)` _macOS_ _Linux_
### `app.setAboutPanelOptions(options)`

* `options` Object
* `applicationName` String (optional) - The app's name.
* `applicationVersion` String (optional) - The app's version.
* `copyright` String (optional) - Copyright information.
* `version` String (optional) _macOS_ - The app's build version number.
* `credits` String (optional) _macOS_ - Credit information.
* `credits` String (optional) _macOS_ _Windows_ - Credit information.
* `authors` String[] (optional) _Linux_ - List of app authors.
* `website` String (optional) _Linux_ - The app's website.
* `iconPath` String (optional) _Linux_ - Path to the app's icon. Will be shown as 64x64 pixels while retaining aspect ratio.
* `iconPath` String (optional) _Linux_ _Windows_ - Path to the app's icon. On Linux, will be shown as 64x64 pixels while retaining aspect ratio.

Set the about panel options. This will override the values defined in the app's
`.plist` file on MacOS. See the [Apple docs][about-panel-options] for more details. On Linux, values must be set in order to be shown; there are no defaults.
Expand Down
2 changes: 0 additions & 2 deletions shell/browser/api/atom_api_app.cc
Expand Up @@ -1459,12 +1459,10 @@ void App::BuildPrototype(v8::Isolate* isolate,
.SetMethod("moveToApplicationsFolder", &App::MoveToApplicationsFolder)
.SetMethod("isInApplicationsFolder", &App::IsInApplicationsFolder)
#endif
#if defined(OS_MACOSX) || defined(OS_LINUX)
.SetMethod("setAboutPanelOptions",
base::BindRepeating(&Browser::SetAboutPanelOptions, browser))
.SetMethod("showAboutPanel",
base::BindRepeating(&Browser::ShowAboutPanel, browser))
#endif
#if defined(OS_MACOSX) || defined(OS_WIN)
.SetMethod("showEmojiPanel",
base::BindRepeating(&Browser::ShowEmojiPanel, browser))
Expand Down
4 changes: 1 addition & 3 deletions shell/browser/browser.h
Expand Up @@ -186,10 +186,8 @@ class Browser : public WindowListObserver {

#endif // defined(OS_MACOSX)

#if defined(OS_MACOSX) || defined(OS_LINUX)
void ShowAboutPanel();
void SetAboutPanelOptions(const base::DictionaryValue& options);
#endif

#if defined(OS_MACOSX) || defined(OS_WIN)
void ShowEmojiPanel();
Expand Down Expand Up @@ -305,7 +303,7 @@ class Browser : public WindowListObserver {

std::unique_ptr<util::Promise> ready_promise_;

#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_WIN)
base::Value about_panel_options_;
#elif defined(OS_MACOSX)
base::DictionaryValue about_panel_options_;
Expand Down
55 changes: 53 additions & 2 deletions shell/browser/browser_win.cc
Expand Up @@ -22,9 +22,11 @@
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
#include "electron/electron_version.h"
#include "shell/browser/ui/message_box.h"
#include "shell/browser/ui/win/jump_list.h"
#include "shell/common/application_info.h"
#include "shell/common/native_mate_converters/string16_converter.h"
#include "shell/common/skia_util.h"
#include "ui/events/keycodes/keyboard_code_conversion_win.h"

namespace electron {
Expand Down Expand Up @@ -83,6 +85,16 @@ bool FormatCommandLineString(base::string16* exe,
return true;
}

std::unique_ptr<FileVersionInfo> FetchFileVersionInfo() {
base::FilePath path;

if (base::PathService::Get(base::FILE_EXE, &path)) {
base::ThreadRestrictions::ScopedAllowIO allow_io;
return FileVersionInfo::CreateFileVersionInfo(path);
}
return std::unique_ptr<FileVersionInfo>();
}

} // namespace

Browser::UserTask::UserTask() = default;
Expand Down Expand Up @@ -333,8 +345,7 @@ std::string Browser::GetExecutableFileVersion() const {
base::FilePath path;
if (base::PathService::Get(base::FILE_EXE, &path)) {
base::ThreadRestrictions::ScopedAllowIO allow_io;
std::unique_ptr<FileVersionInfo> version_info(
FileVersionInfo::CreateFileVersionInfo(path));
std::unique_ptr<FileVersionInfo> version_info = FetchFileVersionInfo();
return base::UTF16ToUTF8(version_info->product_version());
}

Expand Down Expand Up @@ -369,4 +380,44 @@ void Browser::ShowEmojiPanel() {
::SendInput(4, input, sizeof(INPUT));
}

void Browser::ShowAboutPanel() {
base::Value dict(base::Value::Type::DICTIONARY);
std::string aboutMessage = "";
gfx::ImageSkia image;

// grab defaults from Windows .EXE file
std::unique_ptr<FileVersionInfo> exe_info = FetchFileVersionInfo();
dict.SetStringKey("applicationName", exe_info->file_description());
dict.SetStringKey("applicationVersion", exe_info->product_version());

if (about_panel_options_.is_dict()) {
dict.MergeDictionary(&about_panel_options_);
}

std::vector<std::string> stringOptions = {
"applicationName", "applicationVersion", "copyright", "credits"};

const std::string* str;
for (std::string opt : stringOptions) {
if ((str = dict.FindStringKey(opt))) {
aboutMessage.append(*str).append("\r\n");
}
}

if ((str = dict.FindStringKey("iconPath"))) {
base::FilePath path = base::FilePath::FromUTF8Unsafe(*str);
electron::util::PopulateImageSkiaRepsFromPath(&image, path);
}

electron::MessageBoxSettings settings = {};
settings.message = aboutMessage;
settings.icon = image;
settings.type = electron::MessageBoxType::kInformation;
electron::ShowMessageBoxSync(settings);
}

void Browser::SetAboutPanelOptions(const base::DictionaryValue& options) {
about_panel_options_ = options.Clone();
}

} // namespace electron