summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-25 21:40:10 +0000
committerjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-25 21:40:10 +0000
commitedee3faf1cbf22b074a0c95304a37d22246ccf32 (patch)
tree026082ab3764ed0b71de68bcc45dee4df7db3e3c /chrome
parent7fa7b19611b8f2ed130ec89c8ce3fe5cff5c14c1 (diff)
downloadchromium_src-edee3faf1cbf22b074a0c95304a37d22246ccf32.zip
chromium_src-edee3faf1cbf22b074a0c95304a37d22246ccf32.tar.gz
chromium_src-edee3faf1cbf22b074a0c95304a37d22246ccf32.tar.bz2
Show "About panel" bubble on Windows.
BUG=none TEST=panel_browser_view_browsertest Review URL: http://codereview.chromium.org/7011015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86712 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/generated_resources.grd11
-rw-r--r--chrome/app/resources/locale_settings.grd9
-rw-r--r--chrome/browser/ui/panels/about_panel_bubble.cc213
-rw-r--r--chrome/browser/ui/panels/about_panel_bubble.h79
-rw-r--r--chrome/browser/ui/panels/panel_browser_frame_view.cc11
-rw-r--r--chrome/browser/ui/panels/panel_browser_view_browsertest.cc101
-rw-r--r--chrome/browser/ui/views/bubble/bubble.h4
-rw-r--r--chrome/browser/web_applications/web_app.cc7
-rw-r--r--chrome/browser/web_applications/web_app.h3
-rw-r--r--chrome/chrome_browser.gypi6
10 files changed, 444 insertions, 0 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 1ceab02..baac445 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -12496,6 +12496,17 @@ Keep your key file in a safe place. You will need it to create new versions of y
bookmarks_<ph name="DATESTAMP">$1<ex>02_11_11</ex></ph>.html
</message>
+ <!-- Panels -->
+ <message name="IDS_ABOUT_PANEL_BUBBLE_EXTENSION_INSTALL_DATE" desc="Text for the label of the about panel bubble to show the extension install date.">
+ Extension installed: <ph name="DATE">$1<ex>January 1, 2011</ex></ph>
+ </message>
+ <message name="IDS_ABOUT_PANEL_BUBBLE_UNINSTALL_EXTENSION" desc="Text for the link shown on the about panel bubble to uninstall the extension.">
+ Uninstall <ph name="EXTENSION_NAME">$1<ex>Sample Extension</ex></ph>
+ </message>
+ <message name="IDS_ABOUT_PANEL_BUBBLE_REPORT_ABUSE" desc="Text for the link shown on the about panel bubble to report the abuse.">
+ Report abuse
+ </message>
+
</messages>
<includes>
<if expr="pp_ifdef('_google_chrome')">
diff --git a/chrome/app/resources/locale_settings.grd b/chrome/app/resources/locale_settings.grd
index 36e8e5c..aece755 100644
--- a/chrome/app/resources/locale_settings.grd
+++ b/chrome/app/resources/locale_settings.grd
@@ -553,6 +553,15 @@
<message name="IDS_DEFAULT_SEARCH_WIDTH_CHARS" use_name_for_id="true">
82
</message>
+
+ <!-- The width and height of the About Panel Information bubble in -->
+ <!-- characters and lines (See above). -->
+ <message name="IDS_ABOUTPANELBUBBLE_WIDTH_CHARS" use_name_for_id="true">
+ 56
+ </message>
+ <message name="IDS_ABOUTPANELBUBBLE_HEIGHT_LINES" use_name_for_id="true">
+ 8
+ </message>
</messages>
</release>
</grit>
diff --git a/chrome/browser/ui/panels/about_panel_bubble.cc b/chrome/browser/ui/panels/about_panel_bubble.cc
new file mode 100644
index 0000000..07ff668
--- /dev/null
+++ b/chrome/browser/ui/panels/about_panel_bubble.cc
@@ -0,0 +1,213 @@
+// Copyright (c) 2011 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 "chrome/browser/ui/panels/about_panel_bubble.h"
+
+#include "base/i18n/time_formatting.h"
+#include "base/logging.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/extensions/extension_prefs.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/common/extensions/extension.h"
+#include "grit/generated_resources.h"
+#include "grit/locale_settings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "views/controls/image_view.h"
+#include "views/controls/label.h"
+#include "views/controls/link.h"
+#include "views/controls/textfield/textfield.h"
+#include "views/window/window.h"
+
+namespace {
+
+// Extra padding to put around content over what the InfoBubble provides.
+const int kBubblePadding = 4;
+
+// Horizontal spacing between the icon and the contents.
+const int kIconHorizontalSpacing = 4;
+
+// Vertical spacing between two controls.
+const int kControlVerticalSpacing = 10;
+
+// Horizontal spacing between the text and the left/right of a description.
+const int kDescriptionHorizontalSpacing = 6;
+
+// Vertical spacing between the text and the top/bottom of a description.
+const int kDescriptionVertialSpacing = 4;
+
+// Horizontal spacing between two links.
+const int kLinksHorizontalSpacing = 20;
+
+// Text color of a description.
+const SkColor kDescriptionTextColor = SK_ColorBLACK;
+
+// Background color of a description.
+const SkColor kDescriptionBackgroundColor = 0xFFE8E8EE;
+
+}
+
+// AboutPanelBubbleView --------------------------------------------------------
+
+AboutPanelBubble::AboutPanelBubbleView::AboutPanelBubbleView(
+ SkBitmap icon, Browser* browser, const Extension* extension)
+ : icon_(NULL),
+ title_(NULL),
+ install_date_(NULL),
+ description_(NULL),
+ uninstall_link_(NULL),
+ report_abuse_link_(NULL) {
+ const gfx::Font& font =
+ ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
+
+ icon_ = new views::ImageView();
+ icon_->SetImage(icon);
+ AddChildView(icon_);
+
+ title_ = new views::Label(UTF8ToWide(extension->name()));
+ title_->SetFont(font.DeriveFont(0, gfx::Font::BOLD));
+ title_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ AddChildView(title_);
+
+ base::Time install_time = browser->GetProfile()->GetExtensionService()->
+ extension_prefs()->GetInstallTime(extension->id());
+ install_date_ = new views::Label(UTF16ToWide(
+ l10n_util::GetStringFUTF16(
+ IDS_ABOUT_PANEL_BUBBLE_EXTENSION_INSTALL_DATE,
+ base::TimeFormatFriendlyDate(install_time))));
+ install_date_->SetMultiLine(true);
+ install_date_->SetFont(font);
+ install_date_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ install_date_->SizeToFit(GetPreferredSize().width() - kBubblePadding * 2);
+ AddChildView(install_date_);
+
+ description_ = new views::Textfield(views::Textfield::STYLE_MULTILINE);
+ description_->SetText(UTF8ToUTF16(extension->description()));
+ description_->SetHeightInLines(2);
+ description_->SetHorizontalMargins(kDescriptionHorizontalSpacing,
+ kDescriptionHorizontalSpacing);
+ description_->SetVerticalMargins(kDescriptionVertialSpacing,
+ kDescriptionVertialSpacing);
+ description_->SetFont(font);
+ description_->SetTextColor(kDescriptionTextColor);
+ description_->SetBackgroundColor(kDescriptionBackgroundColor);
+ description_->RemoveBorder();
+ description_->SetReadOnly(true);
+ AddChildView(description_);
+
+ uninstall_link_ = new views::Link(UTF16ToWide(
+ l10n_util::GetStringFUTF16(IDS_ABOUT_PANEL_BUBBLE_UNINSTALL_EXTENSION,
+ UTF8ToUTF16(extension->name()))));
+ AddChildView(uninstall_link_);
+
+ report_abuse_link_ = new views::Link(UTF16ToWide(
+ l10n_util::GetStringUTF16(IDS_ABOUT_PANEL_BUBBLE_REPORT_ABUSE)));
+ AddChildView(report_abuse_link_);
+}
+
+void AboutPanelBubble::AboutPanelBubbleView::Layout() {
+ gfx::Size icon_size = icon_->GetPreferredSize();
+ icon_->SetBounds(kBubblePadding,
+ kBubblePadding,
+ icon_size.width(),
+ icon_size.height());
+
+ gfx::Size canvas = GetPreferredSize();
+ int content_left_margin =
+ kBubblePadding + icon_size.width() + kIconHorizontalSpacing;
+ int content_width = canvas.width() - kBubblePadding - content_left_margin;
+
+ gfx::Size pref_size = title_->GetPreferredSize();
+ title_->SetBounds(content_left_margin,
+ kBubblePadding,
+ content_width,
+ pref_size.height());
+
+ int next_y = title_->bounds().bottom() + kControlVerticalSpacing;
+
+ pref_size = install_date_->GetPreferredSize();
+ install_date_->SetBounds(content_left_margin,
+ next_y,
+ content_width,
+ pref_size.height());
+
+ next_y = install_date_->bounds().bottom() + kControlVerticalSpacing;
+
+ pref_size = description_->GetPreferredSize();
+ description_->SetBounds(
+ content_left_margin,
+ next_y,
+ content_width,
+ pref_size.height() + kDescriptionVertialSpacing * 2);
+
+ next_y = description_->bounds().bottom() + kControlVerticalSpacing;
+
+ pref_size = uninstall_link_->GetPreferredSize();
+ uninstall_link_->SetBounds(content_left_margin,
+ next_y,
+ pref_size.width(),
+ pref_size.height());
+
+ pref_size = report_abuse_link_->GetPreferredSize();
+ report_abuse_link_->SetBounds(
+ content_left_margin + uninstall_link_->width() + kLinksHorizontalSpacing,
+ next_y,
+ pref_size.width(),
+ pref_size.height());
+}
+
+gfx::Size AboutPanelBubble::AboutPanelBubbleView::GetPreferredSize() {
+ return views::Window::GetLocalizedContentsSize(
+ IDS_ABOUTPANELBUBBLE_WIDTH_CHARS,
+ IDS_ABOUTPANELBUBBLE_HEIGHT_LINES);
+}
+
+void AboutPanelBubble::AboutPanelBubbleView::LinkClicked(views::Link* source,
+ int event_flags) {
+ NOTIMPLEMENTED();
+}
+
+// AboutPanelBubble ------------------------------------------------------------
+
+// static
+AboutPanelBubble* AboutPanelBubble::Show(
+ views::Widget* parent,
+ const gfx::Rect& position_relative_to,
+ BubbleBorder::ArrowLocation arrow_location,
+ SkBitmap icon,
+ Browser* browser) {
+ // Find the extension. When we create a panel from an extension, the extension
+ // ID is passed as the app name to the Browser.
+ ExtensionService* extension_service =
+ browser->GetProfile()->GetExtensionService();
+ const Extension* extension = extension_service->GetExtensionById(
+ web_app::GetExtensionIdFromApplicationName(browser->app_name()), false);
+ if (!extension)
+ return NULL;
+
+ AboutPanelBubble* bubble = new AboutPanelBubble();
+ AboutPanelBubbleView* view = new AboutPanelBubbleView(
+ icon, browser, extension);
+ bubble->InitBubble(
+ parent, position_relative_to, arrow_location, view, bubble);
+ return bubble;
+}
+
+AboutPanelBubble::AboutPanelBubble() {
+}
+
+bool AboutPanelBubble::CloseOnEscape() {
+ return true;
+}
+
+bool AboutPanelBubble::FadeInOnShow() {
+ return false;
+}
+
+std::wstring AboutPanelBubble::accessible_name() {
+ return L"AboutPanelBubble";
+}
diff --git a/chrome/browser/ui/panels/about_panel_bubble.h b/chrome/browser/ui/panels/about_panel_bubble.h
new file mode 100644
index 0000000..6f6ddcc
--- /dev/null
+++ b/chrome/browser/ui/panels/about_panel_bubble.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2011 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.
+
+#ifndef CHROME_BROWSER_UI_PANELS_ABOUT_PANEL_BUBBLE_H_
+#define CHROME_BROWSER_UI_PANELS_ABOUT_PANEL_BUBBLE_H_
+#pragma once
+
+#include "base/gtest_prod_util.h"
+#include "chrome/browser/ui/views/bubble/bubble.h"
+#include "views/controls/link_listener.h"
+
+class Browser;
+class Extension;
+namespace views {
+class ImageView;
+class Label;
+class Link;
+class Textfield;
+}
+
+class AboutPanelBubble : public Bubble,
+ public BubbleDelegate {
+ public:
+ // Returns NULL if no extension can be found for |browser|.
+ static AboutPanelBubble* Show(views::Widget* parent,
+ const gfx::Rect& position_relative_to,
+ BubbleBorder::ArrowLocation arrow_location,
+ SkBitmap icon,
+ Browser* browser);
+
+ private:
+ friend class PanelBrowserViewTest;
+ FRIEND_TEST_ALL_PREFIXES(PanelBrowserViewTest, AboutPanelBubble);
+
+ class AboutPanelBubbleView : public views::View,
+ public views::LinkListener {
+ public:
+ AboutPanelBubbleView(SkBitmap icon,
+ Browser* browser,
+ const Extension* extension);
+
+ private:
+ friend class PanelBrowserViewTest;
+ FRIEND_TEST_ALL_PREFIXES(PanelBrowserViewTest, AboutPanelBubble);
+
+ virtual ~AboutPanelBubbleView() { }
+
+ // Overridden from View:
+ virtual void Layout() OVERRIDE;
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+
+ // Overridden from LinkListener:
+ virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
+
+ views::ImageView* icon_;
+ views::Label* title_;
+ views::Label* install_date_;
+ views::Textfield* description_;
+ views::Link* uninstall_link_;
+ views::Link* report_abuse_link_;
+
+ DISALLOW_COPY_AND_ASSIGN(AboutPanelBubbleView);
+ };
+
+ AboutPanelBubble();
+ virtual ~AboutPanelBubble() { }
+
+ // Overridden from BubbleDelegate:
+ virtual void BubbleClosing(Bubble* info_bubble, bool closed_by_escape)
+ OVERRIDE {}
+ virtual bool CloseOnEscape() OVERRIDE;
+ virtual bool FadeInOnShow() OVERRIDE;
+ virtual std::wstring accessible_name() OVERRIDE;
+
+ DISALLOW_COPY_AND_ASSIGN(AboutPanelBubble);
+};
+
+#endif // CHROME_BROWSER_UI_PANELS_ABOUT_PANEL_BUBBLE_H_
diff --git a/chrome/browser/ui/panels/panel_browser_frame_view.cc b/chrome/browser/ui/panels/panel_browser_frame_view.cc
index c5bc4fa..bc8f3ba 100644
--- a/chrome/browser/ui/panels/panel_browser_frame_view.cc
+++ b/chrome/browser/ui/panels/panel_browser_frame_view.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/panels/panel_browser_frame_view.h"
#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/ui/panels/about_panel_bubble.h"
#include "chrome/browser/ui/panels/panel.h"
#include "chrome/browser/ui/panels/panel_browser_view.h"
#include "chrome/browser/ui/panels/panel_manager.h"
@@ -407,6 +408,16 @@ void PanelBrowserFrameView::ButtonPressed(views::Button* sender,
const views::Event& event) {
if (sender == close_button_)
frame_->Close();
+ else if (sender == info_button_) {
+ gfx::Point origin(info_button_->bounds().origin());
+ views::View::ConvertPointToScreen(this, &origin);
+ AboutPanelBubble::Show(
+ GetWidget(),
+ gfx::Rect(origin, info_button_->bounds().size()),
+ BubbleBorder::BOTTOM_RIGHT,
+ GetFaviconForTabIconView(),
+ browser_view_->browser());
+ }
}
bool PanelBrowserFrameView::ShouldTabIconViewAnimate() const {
diff --git a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc
index 50b4924..3158c05 100644
--- a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc
+++ b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc
@@ -3,17 +3,27 @@
// found in the LICENSE file.
#include "base/command_line.h"
+#include "base/i18n/time_formatting.h"
+#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/panels/about_panel_bubble.h"
#include "chrome/browser/ui/panels/panel.h"
#include "chrome/browser/ui/panels/panel_browser_frame_view.h"
#include "chrome/browser/ui/panels/panel_browser_view.h"
+#include "chrome/browser/web_applications/web_app.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/extension.h"
#include "chrome/test/in_process_browser_test.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "views/controls/button/image_button.h"
+#include "views/controls/image_view.h"
#include "views/controls/label.h"
+#include "views/controls/link.h"
+#include "views/controls/textfield/textfield.h"
class PanelBrowserViewTest : public InProcessBrowserTest {
public:
@@ -406,4 +416,95 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, TitleBarMouseEvent) {
EXPECT_FALSE(browser_views[i]->panel());
}
}
+
+IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, AboutPanelBubble) {
+ ExtensionService* extension_service =
+ browser()->GetProfile()->GetExtensionService();
+
+ // Create a testing extension.
+#if defined(OS_WIN)
+ FilePath path(FILE_PATH_LITERAL("c:\\foo"));
+#else
+ FilePath path(FILE_PATH_LITERAL("/foo"));
+#endif
+ DictionaryValue input_value;
+ input_value.SetString(extension_manifest_keys::kVersion, "1.0.0.0");
+ input_value.SetString(extension_manifest_keys::kName, "Sample Extension");
+ input_value.SetString(extension_manifest_keys::kDescription,
+ "Sample Description");
+ scoped_refptr<Extension> extension(Extension::Create(path, Extension::INVALID,
+ input_value, Extension::STRICT_ERROR_CHECKS, NULL));
+ ASSERT_TRUE(extension.get());
+ extension_service->AddExtension(extension.get());
+ // Make sure that async task ExtensionPrefs::OnExtensionInstalled gets a
+ // chance to be procesed.
+ MessageLoop::current()->RunAllPending();
+
+ extension_service->extension_prefs()->OnExtensionInstalled(
+ extension, Extension::ENABLED);
+
+ // Create a panel with the app name that comes from the extension ID.
+ PanelBrowserView* browser_view = CreatePanelBrowserView(
+ web_app::GenerateApplicationNameFromExtensionId(extension->id()));
+
+ AboutPanelBubble* bubble = AboutPanelBubble::Show(
+ browser_view->GetWidget(),
+ gfx::Rect(),
+ BubbleBorder::BOTTOM_RIGHT,
+ SkBitmap(),
+ browser_view->browser());
+ AboutPanelBubble::AboutPanelBubbleView* contents =
+ static_cast<AboutPanelBubble::AboutPanelBubbleView*>(bubble->contents());
+
+ // We should have the expected controls.
+ EXPECT_EQ(6, contents->child_count());
+ EXPECT_TRUE(contents->Contains(contents->icon_));
+ EXPECT_TRUE(contents->Contains(contents->title_));
+ EXPECT_TRUE(contents->Contains(contents->install_date_));
+ EXPECT_TRUE(contents->Contains(contents->description_));
+ EXPECT_TRUE(contents->Contains(contents->uninstall_link_));
+ EXPECT_TRUE(contents->Contains(contents->report_abuse_link_));
+
+ // These controls should be visible.
+ EXPECT_TRUE(contents->icon_->IsVisible());
+ EXPECT_TRUE(contents->title_->IsVisible());
+ EXPECT_TRUE(contents->install_date_->IsVisible());
+ EXPECT_TRUE(contents->description_->IsVisible());
+ EXPECT_TRUE(contents->uninstall_link_->IsVisible());
+ EXPECT_TRUE(contents->report_abuse_link_->IsVisible());
+
+ // Validate their layouts.
+ EXPECT_GT(contents->title_->x(), contents->icon_->x());
+ EXPECT_GT(contents->title_->width(), 0);
+ EXPECT_GT(contents->title_->height(), 0);
+ EXPECT_EQ(contents->install_date_->x(), contents->title_->x());
+ EXPECT_GT(contents->install_date_->y(), contents->title_->y());
+ EXPECT_GT(contents->install_date_->width(), 0);
+ EXPECT_GT(contents->install_date_->height(), 0);
+ EXPECT_EQ(contents->description_->x(), contents->install_date_->x());
+ EXPECT_GT(contents->description_->y(), contents->install_date_->y());
+ EXPECT_GT(contents->description_->width(), 0);
+ EXPECT_GT(contents->description_->height(), 0);
+ EXPECT_EQ(contents->uninstall_link_->x(), contents->description_->x());
+ EXPECT_GT(contents->uninstall_link_->y(), contents->description_->y());
+ EXPECT_GT(contents->uninstall_link_->width(), 0);
+ EXPECT_GT(contents->uninstall_link_->height(), 0);
+ EXPECT_GT(contents->report_abuse_link_->x(), contents->uninstall_link_->x());
+ EXPECT_EQ(contents->report_abuse_link_->y(), contents->uninstall_link_->y());
+ EXPECT_GT(contents->report_abuse_link_->width(), 0);
+ EXPECT_GT(contents->report_abuse_link_->height(), 0);
+
+ // Validates the texts.
+ base::Time install_time =
+ extension_service->extension_prefs()->GetInstallTime(extension->id());
+ string16 time_text = l10n_util::GetStringFUTF16(
+ IDS_ABOUT_PANEL_BUBBLE_EXTENSION_INSTALL_DATE,
+ base::TimeFormatFriendlyDate(
+ extension_service->extension_prefs()->GetInstallTime(
+ extension->id())));
+ EXPECT_STREQ(UTF16ToUTF8(time_text).c_str(),
+ WideToUTF8(contents->install_date_->GetText()).c_str());
+ EXPECT_STREQ(extension->description().c_str(),
+ UTF16ToUTF8(contents->description_->text()).c_str());
+}
#endif
diff --git a/chrome/browser/ui/views/bubble/bubble.h b/chrome/browser/ui/views/bubble/bubble.h
index 0c9e587..9c2735c 100644
--- a/chrome/browser/ui/views/bubble/bubble.h
+++ b/chrome/browser/ui/views/bubble/bubble.h
@@ -130,6 +130,10 @@ class Bubble
virtual void AnimationEnded(const ui::Animation* animation);
virtual void AnimationProgressed(const ui::Animation* animation);
+#ifdef UNIT_TEST
+ views::View* contents() const { return contents_; }
+#endif
+
static const SkColor kBackgroundColor;
protected:
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index 37bd0fe..31dd877 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -475,6 +475,13 @@ std::string GenerateApplicationNameFromExtensionId(const std::string& id) {
return t;
}
+std::string GetExtensionIdFromApplicationName(const std::string& app_name) {
+ std::string prefix(kCrxAppPrefix);
+ if (app_name.substr(0, prefix.length()) != prefix)
+ return std::string();
+ return app_name.substr(prefix.length());
+}
+
void CreateShortcut(
const FilePath& data_dir,
const ShellIntegration::ShortcutInfo& shortcut_info,
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h
index f9de9dd..0718fb8 100644
--- a/chrome/browser/web_applications/web_app.h
+++ b/chrome/browser/web_applications/web_app.h
@@ -30,6 +30,9 @@ std::string GenerateApplicationNameFromURL(const GURL& url);
// Compute a deterministic name based on an extension/apps's id.
std::string GenerateApplicationNameFromExtensionId(const std::string& id);
+// Extracts the extension id from the app name.
+std::string GetExtensionIdFromApplicationName(const std::string& app_name);
+
// Callback after user dismisses CreateShortcutView. "true" indicates
// shortcut is created successfully. Otherwise, it is false.
typedef Callback1<bool>::Type CreateShortcutCallback;
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 47a96b4..195231b 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2843,6 +2843,8 @@
'browser/ui/omnibox/omnibox_view.h',
'browser/ui/options/options_util.cc',
'browser/ui/options/options_util.h',
+ 'browser/ui/panels/about_panel_bubble.cc',
+ 'browser/ui/panels/about_panel_bubble.h',
'browser/ui/panels/panel.cc',
'browser/ui/panels/panel.h',
'browser/ui/panels/panel_browser_frame_view.cc',
@@ -3716,6 +3718,8 @@
'browser/power_save_blocker_stub.cc',
'browser/ui/browser_list_stub.cc',
'browser/ui/crypto_module_password_dialog_nss.cc',
+ 'browser/ui/panels/about_panel_bubble.cc',
+ 'browser/ui/panels/about_panel_bubble.h',
'browser/ui/panels/panel_browser_frame_view.cc',
'browser/ui/panels/panel_browser_frame_view.h',
'browser/ui/panels/panel_browser_view.cc',
@@ -4296,6 +4300,8 @@
['include', '^browser/printing/print_dialog_gtk.h'],
['exclude', '^browser/bookmarks/bookmark_drop_info.cc'],
['exclude', '^browser/ui/browser_list_stub.cc'],
+ ['exclude', '^browser/ui/panels/about_panel_bubble.cc'],
+ ['exclude', '^browser/ui/panels/about_panel_bubble.h'],
['exclude', '^browser/ui/panels/panel_browser_frame_view.cc'],
['exclude', '^browser/ui/panels/panel_browser_frame_view.h'],
['exclude', '^browser/ui/panels/panel_browser_view.cc'],