| Index: chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
|
| diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
|
| index fae9adcb79267eedbeeb9440305679d8057c54c4..797ddea81f3592770f153982cc488f2095ed8a48 100644
|
| --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
|
| +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
|
| @@ -22,11 +22,14 @@
|
| #include "extensions/browser/extension_system.h"
|
| #include "extensions/common/extension.h"
|
| #include "extensions/common/manifest.h"
|
| +#include "extensions/common/manifest_handlers/shared_module_info.h"
|
| +#include "extensions/common/manifest_url_handlers.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/models/combobox_model.h"
|
| #include "ui/base/text/bytes_formatting.h"
|
| #include "ui/views/controls/combobox/combobox.h"
|
| #include "ui/views/controls/label.h"
|
| +#include "ui/views/controls/link.h"
|
| #include "ui/views/layout/box_layout.h"
|
| #include "ui/views/layout/layout_constants.h"
|
| #include "ui/views/view.h"
|
| @@ -128,6 +131,8 @@ AppInfoSummaryPanel::AppInfoSummaryPanel(Profile* profile,
|
| const extensions::Extension* app)
|
| : AppInfoPanel(profile, app),
|
| size_value_(NULL),
|
| + homepage_link_(NULL),
|
| + licenses_link_(NULL),
|
| launch_options_combobox_(NULL),
|
| weak_ptr_factory_(this) {
|
| SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
|
| @@ -143,24 +148,48 @@ AppInfoSummaryPanel::~AppInfoSummaryPanel() {
|
| RemoveAllChildViews(true);
|
| }
|
|
|
| -void AppInfoSummaryPanel::AddDescriptionControl(views::View* vertical_stack) {
|
| - if (app_->description().empty())
|
| - return;
|
| +void AppInfoSummaryPanel::AddDescriptionAndLinksControl(
|
| + views::View* vertical_stack) {
|
| + views::View* description_and_labels_stack = new views::View();
|
| + description_and_labels_stack->SetLayoutManager(
|
| + new views::BoxLayout(views::BoxLayout::kVertical,
|
| + 0,
|
| + 0,
|
| + views::kRelatedControlSmallVerticalSpacing));
|
| +
|
| + if (!app_->description().empty()) {
|
| + // TODO(sashab): Clip the app's description to 4 lines, and use Label's
|
| + // built-in elide behavior to add ellipses at the end: crbug.com/358053
|
| + const size_t max_length = 400;
|
| + base::string16 text = base::UTF8ToUTF16(app_->description());
|
| + if (text.length() > max_length) {
|
| + text = text.substr(0, max_length);
|
| + text += base::ASCIIToUTF16(" ... ");
|
| + }
|
| +
|
| + views::Label* description_label = new views::Label(text);
|
| + description_label->SetMultiLine(true);
|
| + description_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + description_and_labels_stack->AddChildView(description_label);
|
| + }
|
|
|
| - // TODO(sashab): Clip the app's description to 4 lines, and use Label's
|
| - // built-in elide behavior to add ellipses at the end: crbug.com/358053
|
| - const size_t max_length = 400;
|
| - base::string16 text = base::UTF8ToUTF16(app_->description());
|
| - if (text.length() > max_length) {
|
| - text = text.substr(0, max_length);
|
| - text += base::ASCIIToUTF16(" ... ");
|
| + if (CanShowAppHomePage()) {
|
| + homepage_link_ = new views::Link(
|
| + l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_HOMEPAGE_LINK));
|
| + homepage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + homepage_link_->set_listener(this);
|
| + description_and_labels_stack->AddChildView(homepage_link_);
|
| }
|
|
|
| - views::Label* description_label = new views::Label(text);
|
| - description_label->SetMultiLine(true);
|
| - description_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + if (CanDisplayLicenses()) {
|
| + licenses_link_ = new views::Link(
|
| + l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_LICENSES_BUTTON_TEXT));
|
| + licenses_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + licenses_link_->set_listener(this);
|
| + description_and_labels_stack->AddChildView(licenses_link_);
|
| + }
|
|
|
| - vertical_stack->AddChildView(description_label);
|
| + vertical_stack->AddChildView(description_and_labels_stack);
|
| }
|
|
|
| void AppInfoSummaryPanel::AddDetailsControl(views::View* vertical_stack) {
|
| @@ -222,7 +251,7 @@ void AppInfoSummaryPanel::AddSubviews() {
|
| CreateVerticalStack(views::kUnrelatedControlVerticalSpacing);
|
| AddChildView(vertical_stack);
|
|
|
| - AddDescriptionControl(vertical_stack);
|
| + AddDescriptionAndLinksControl(vertical_stack);
|
| AddDetailsControl(vertical_stack);
|
| AddLaunchOptionControl(vertical_stack);
|
| }
|
| @@ -236,6 +265,16 @@ void AppInfoSummaryPanel::OnPerformAction(views::Combobox* combobox) {
|
| }
|
| }
|
|
|
| +void AppInfoSummaryPanel::LinkClicked(views::Link* source, int event_flags) {
|
| + if (source == homepage_link_) {
|
| + ShowAppHomePage();
|
| + } else if (source == licenses_link_) {
|
| + DisplayLicenses();
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| void AppInfoSummaryPanel::StartCalculatingAppSize() {
|
| base::PostTaskAndReplyWithResult(
|
| content::BrowserThread::GetBlockingPool(),
|
| @@ -274,3 +313,46 @@ bool AppInfoSummaryPanel::CanSetLaunchType() const {
|
| return !app_->is_platform_app() && !app_->is_extension() &&
|
| app_->id() != extension_misc::kChromeAppId;
|
| }
|
| +void AppInfoSummaryPanel::ShowAppHomePage() {
|
| + DCHECK(CanShowAppHomePage());
|
| + OpenLink(extensions::ManifestURL::GetHomepageURL(app_));
|
| + Close();
|
| +}
|
| +
|
| +bool AppInfoSummaryPanel::CanShowAppHomePage() const {
|
| + return extensions::ManifestURL::SpecifiedHomepageURL(app_);
|
| +}
|
| +
|
| +void AppInfoSummaryPanel::DisplayLicenses() {
|
| + DCHECK(CanDisplayLicenses());
|
| + for (const auto& license_url : GetLicenseUrls())
|
| + OpenLink(license_url);
|
| + Close();
|
| +}
|
| +
|
| +bool AppInfoSummaryPanel::CanDisplayLicenses() const {
|
| + return !GetLicenseUrls().empty();
|
| +}
|
| +
|
| +const std::vector<GURL> AppInfoSummaryPanel::GetLicenseUrls() const {
|
| + if (!extensions::SharedModuleInfo::ImportsModules(app_))
|
| + return std::vector<GURL>();
|
| +
|
| + std::vector<GURL> license_urls;
|
| + ExtensionService* service =
|
| + extensions::ExtensionSystem::Get(profile_)->extension_service();
|
| + DCHECK(service);
|
| + const std::vector<extensions::SharedModuleInfo::ImportInfo>& imports =
|
| + extensions::SharedModuleInfo::GetImports(app_);
|
| +
|
| + for (const auto& shared_module : imports) {
|
| + const extensions::Extension* imported_module =
|
| + service->GetExtensionById(shared_module.extension_id, true);
|
| + DCHECK(imported_module);
|
| +
|
| + GURL about_page = extensions::ManifestURL::GetAboutPage(imported_module);
|
| + if (about_page != GURL::EmptyGURL())
|
| + license_urls.push_back(about_page);
|
| + }
|
| + return license_urls;
|
| +}
|
|
|