Index: content/shell/shell_aura.cc |
diff --git a/content/shell/shell_aura.cc b/content/shell/shell_aura.cc |
index 36ce8c0fadac8e2e9951c18457a5674cf30507b8..edb6461f4a11ee03be2f18c2907da923847fa86e 100644 |
--- a/content/shell/shell_aura.cc |
+++ b/content/shell/shell_aura.cc |
@@ -4,10 +4,340 @@ |
#include "content/shell/shell.h" |
+#include "base/utf_string_conversions.h" |
+#include "ui/aura/desktop/desktop_screen.h" |
+#include "ui/aura/desktop/desktop_stacking_client.h" |
+#include "ui/aura/display_manager.h" |
+#include "ui/aura/env.h" |
+#include "ui/aura/root_window.h" |
+#include "ui/aura/window.h" |
+#include "ui/aura/single_display_manager.h" |
+#include "ui/base/accessibility/accessibility_types.h" |
+#include "ui/base/clipboard/clipboard.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/screen.h" |
+#include "ui/views/controls/button/text_button.h" |
+#include "ui/views/controls/textfield/textfield.h" |
+#include "ui/views/controls/textfield/textfield_controller.h" |
+#include "ui/views/controls/webview/webview.h" |
+#include "ui/views/layout/fill_layout.h" |
+#include "ui/views/layout/grid_layout.h" |
+#include "ui/views/view.h" |
+#include "ui/views/views_delegate.h" |
+#include "ui/views/widget/desktop_native_widget_helper_aura.h" |
+#include "ui/views/widget/widget.h" |
+#include "ui/views/widget/widget_delegate.h" |
+ |
+#if defined(OS_CHROMEOS) |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#endif |
+ |
+namespace views { |
+// ViewDelegate implementation for aura content shell |
+class ShellViewsDelegateAura : public ViewsDelegate { |
+ public: |
+ ShellViewsDelegateAura() |
+ : use_transparent_windows_(false) { |
+ DCHECK(!ViewsDelegate::views_delegate); |
+ ViewsDelegate::views_delegate = this; |
+ } |
+ |
+ virtual ~ShellViewsDelegateAura() { |
+ ViewsDelegate::views_delegate = NULL; |
+ } |
+ |
+ void SetUseTransparentWindows(bool transparent) { |
+ use_transparent_windows_ = transparent; |
+ } |
+ |
+ // Overridden from ViewsDelegate: |
+ virtual ui::Clipboard* GetClipboard() const OVERRIDE { |
+ if (!clipboard_.get()) { |
+ clipboard_.reset(new ui::Clipboard); |
+ } |
+ return clipboard_.get(); |
+ } |
+ |
+ virtual void SaveWindowPlacement(const Widget* window, |
+ const std::string& window_name, |
+ const gfx::Rect& bounds, |
+ ui::WindowShowState show_state) OVERRIDE { |
+ } |
+ |
+ virtual bool GetSavedWindowPlacement( |
+ const std::string& window_name, |
+ gfx::Rect* bounds, |
+ ui::WindowShowState* show_state) const OVERRIDE { |
+ return false; |
+ } |
+ |
+ virtual void NotifyAccessibilityEvent( |
+ View* view, ui::AccessibilityTypes::Event event_type) OVERRIDE {} |
+ |
+ virtual void NotifyMenuItemFocused(const string16& menu_name, |
+ const string16& menu_item_name, |
+ int item_index, |
+ int item_count, |
+ bool has_submenu) OVERRIDE {} |
+#if defined(OS_WIN) |
+ virtual HICON GetDefaultWindowIcon() const OVERRIDE { |
+ return NULL; |
+ } |
+#endif |
+ virtual NonClientFrameView* CreateDefaultNonClientFrameView( |
+ Widget* widget) OVERRIDE { |
+ return NULL; |
+ } |
+ virtual bool UseTransparentWindows() const OVERRIDE { |
+ return use_transparent_windows_; |
+ } |
+ virtual void AddRef() OVERRIDE {} |
+ virtual void ReleaseRef() OVERRIDE {} |
+ |
+ virtual int GetDispositionForEvent(int event_flags) OVERRIDE { |
+ return 0; |
+ } |
+ |
+ virtual views::NativeWidgetHelperAura* CreateNativeWidgetHelper( |
+ views::NativeWidgetAura* native_widget) OVERRIDE { |
+ return new views::DesktopNativeWidgetHelperAura(native_widget); |
+ } |
+ |
+ virtual content::WebContents* CreateWebContents( |
+ content::BrowserContext* browser_context, |
+ content::SiteInstance* site_instance) OVERRIDE { |
+ return NULL; |
+ } |
+ |
+ private: |
+ mutable scoped_ptr<ui::Clipboard> clipboard_; |
+ bool use_transparent_windows_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShellViewsDelegateAura); |
+}; |
+ |
+// Maintain the UI controls and web view for content shell |
+class ShellWindowDelegateView : public WidgetDelegateView, |
+ public TextfieldController, |
+ public ButtonListener { |
+ public: |
+ enum UIControl { |
+ BACK_BUTTON, |
+ FORWARD_BUTTON, |
+ STOP_BUTTON |
+ }; |
+ |
+ ShellWindowDelegateView(content::Shell* shell) |
+ : shell_(shell), |
+ toolbar_view_(new View), |
+ contents_view_(new View) { |
+ } |
+ virtual ~ShellWindowDelegateView() {} |
+ |
+ // Update the state of UI controls |
+ void SetAddressBarURL(const GURL& url) { |
+ url_entry_->SetText(ASCIIToUTF16(url.spec())); |
+ } |
+ void SetWebContents(content::WebContents* web_contents) { |
+ contents_view_->SetLayoutManager(new FillLayout()); |
+ web_view_ = new WebView(web_contents->GetBrowserContext()); |
+ web_view_->SetWebContents(web_contents); |
+ web_contents->Focus(); |
+ contents_view_->AddChildView(web_view_); |
+ Layout(); |
+ } |
+ void SetWindowTitle(const string16& title) { title_ = title; } |
+ void EnableUIControl(UIControl control, bool is_enabled) { |
+ if (control == BACK_BUTTON) { |
+ back_button_->SetState(is_enabled ? CustomButton::BS_NORMAL |
+ : CustomButton::BS_DISABLED); |
+ } else if (control == FORWARD_BUTTON) { |
+ forward_button_->SetState(is_enabled ? CustomButton::BS_NORMAL |
+ : CustomButton::BS_DISABLED); |
+ } else if (control == STOP_BUTTON) { |
+ stop_button_->SetState(is_enabled ? CustomButton::BS_NORMAL |
+ : CustomButton::BS_DISABLED); |
+ } |
+ } |
+ |
+ private: |
+ // Initialize the UI control contained in shell window |
+ void InitShellWindow() { |
+ set_background(Background::CreateStandardPanelBackground()); |
+ |
+ GridLayout* layout = new GridLayout(this); |
+ SetLayoutManager(layout); |
+ |
+ ColumnSet* column_set = layout->AddColumnSet(0); |
+ column_set->AddPaddingColumn(0, 2); |
+ column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, |
+ GridLayout::USE_PREF, 0, 0); |
+ column_set->AddPaddingColumn(0, 2); |
+ |
+ layout->AddPaddingRow(0, 2); |
+ |
+ // Add toolbar buttons and URL text field |
+ { |
+ layout->StartRow(0, 0); |
+ GridLayout* toolbar_layout = new GridLayout(toolbar_view_); |
+ toolbar_view_->SetLayoutManager(toolbar_layout); |
+ |
+ ColumnSet* toolbar_column_set = |
+ toolbar_layout->AddColumnSet(0); |
+ // Back button |
+ back_button_ = new NativeTextButton(this, ASCIIToUTF16("Back")); |
+ gfx::Size back_button_size = back_button_->GetPreferredSize(); |
+ toolbar_column_set->AddColumn(GridLayout::CENTER, |
+ GridLayout::CENTER, 0, |
+ GridLayout::FIXED, |
+ back_button_size.width(), |
+ back_button_size.width() / 2); |
+ // Forward button |
+ forward_button_ = new NativeTextButton(this, ASCIIToUTF16("Forward")); |
+ gfx::Size forward_button_size = forward_button_->GetPreferredSize(); |
+ toolbar_column_set->AddColumn(GridLayout::CENTER, |
+ GridLayout::CENTER, 0, |
+ GridLayout::FIXED, |
+ forward_button_size.width(), |
+ forward_button_size.width() / 2); |
+ // Refresh button |
+ refresh_button_ = new NativeTextButton(this, ASCIIToUTF16("Refresh")); |
+ gfx::Size refresh_button_size = refresh_button_->GetPreferredSize(); |
+ toolbar_column_set->AddColumn(GridLayout::CENTER, |
+ GridLayout::CENTER, 0, |
+ GridLayout::FIXED, |
+ refresh_button_size.width(), |
+ refresh_button_size.width() / 2); |
+ // Stop button |
+ stop_button_ = new NativeTextButton(this, ASCIIToUTF16("Stop")); |
+ gfx::Size stop_button_size = stop_button_->GetPreferredSize(); |
+ toolbar_column_set->AddColumn(GridLayout::CENTER, |
+ GridLayout::CENTER, 0, |
+ GridLayout::FIXED, |
+ stop_button_size.width(), |
+ stop_button_size.width() / 2); |
+ toolbar_column_set->AddPaddingColumn(0, 2); |
+ // URL entry |
+ url_entry_ = new Textfield(); |
+ url_entry_->SetController(this); |
+ toolbar_column_set->AddColumn(GridLayout::FILL, |
+ GridLayout::FILL, 1, |
+ GridLayout::USE_PREF, 0, 0); |
+ |
+ // Fill up the first row |
+ toolbar_layout->StartRow(0, 0); |
+ toolbar_layout->AddView(back_button_); |
+ toolbar_layout->AddView(forward_button_); |
+ toolbar_layout->AddView(refresh_button_); |
+ toolbar_layout->AddView(stop_button_); |
+ toolbar_layout->AddView(url_entry_); |
+ |
+ layout->AddView(toolbar_view_); |
+ } |
+ |
+ layout->AddPaddingRow(0, 5); |
+ |
+ // Add web contents view as the second row |
+ { |
+ layout->StartRow(1, 0); |
+ layout->AddView(contents_view_); |
+ } |
+ |
+ layout->AddPaddingRow(0, 5); |
+ } |
+ // Overriden from TextfieldController |
+ virtual void ContentsChanged(Textfield* sender, |
+ const string16& new_contents) OVERRIDE { |
+ } |
+ virtual bool HandleKeyEvent(Textfield* sender, |
+ const KeyEvent& key_event) OVERRIDE { |
+ if (sender == url_entry_ && key_event.key_code() == ui::VKEY_RETURN) { |
+ std::string text = UTF16ToUTF8(url_entry_->text()); |
+ GURL url(text); |
+ if (!url.has_scheme()) { |
+ url = GURL(std::string("http://") + std::string(text)); |
+ url_entry_->SetText(ASCIIToUTF16(url.spec())); |
+ } |
+ shell_->LoadURL(url); |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+ // Overriden from ButtonListener |
+ virtual void ButtonPressed(Button* sender, |
+ const Event& event) OVERRIDE { |
+ if (sender == back_button_) |
+ shell_->GoBackOrForward(-1); |
+ else if (sender == forward_button_) |
+ shell_->GoBackOrForward(1); |
+ else if (sender == refresh_button_) |
+ shell_->Reload(); |
+ else if (sender == stop_button_) |
+ shell_->Stop(); |
+ } |
+ |
+ // Overriden from WidgetDelegateView |
+ virtual bool CanResize() const OVERRIDE { return true; } |
+ virtual bool CanMaximize() const OVERRIDE { return true; } |
+ virtual string16 GetWindowTitle() const OVERRIDE { |
+ return title_; |
+ } |
+ virtual void WindowClosing() OVERRIDE { |
+ if (shell_) delete shell_; |
+ } |
+ virtual View* GetContentsView() OVERRIDE { return this; } |
+ |
+ // Overriden from View |
+ virtual void ViewHierarchyChanged(bool is_add, |
+ View* parent, |
+ View* child) OVERRIDE { |
+ if (is_add && child == this) { |
+ InitShellWindow(); |
+ } |
+ } |
+ |
+ private: |
+ // Hold a reference of Shell for deleting it when the window is closing |
+ content::Shell* shell_; |
+ |
+ // Window title |
+ string16 title_; |
+ |
+ // Toolbar view contains forward/backward/reload button and URL entry |
+ View* toolbar_view_; |
+ NativeTextButton* back_button_; |
+ NativeTextButton* forward_button_; |
+ NativeTextButton* refresh_button_; |
+ NativeTextButton* stop_button_; |
+ Textfield* url_entry_; |
+ |
+ // Contents view contains the web contents view |
+ View* contents_view_; |
+ WebView* web_view_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShellWindowDelegateView); |
+}; |
+ |
+} // namespace views |
+ |
namespace content { |
+using views::ShellWindowDelegateView; |
+using views::ShellViewsDelegateAura; |
+ |
+aura::client::StackingClient* Shell::stacking_client_ = NULL; |
+views::ViewsDelegate* Shell::views_delegate_ = NULL; |
+ |
// static |
void Shell::PlatformInitialize() { |
+#if defined(OS_CHROMEOS) |
+ chromeos::DBusThreadManager::Initialize(); |
+#endif |
+ aura::Env::GetInstance()->SetDisplayManager(new aura::SingleDisplayManager); |
+ stacking_client_ = new aura::DesktopStackingClient(); |
+ gfx::Screen::SetInstance(aura::CreateDesktopScreen()); |
+ views_delegate_ = new ShellViewsDelegateAura(); |
} |
base::StringPiece Shell::PlatformResourceProvider(int key) { |
@@ -15,33 +345,69 @@ base::StringPiece Shell::PlatformResourceProvider(int key) { |
} |
void Shell::PlatformExit() { |
+#if defined(OS_CHROMEOS) |
+ chromeos::DBusThreadManager::Shutdown(); |
+#endif |
+ if (stacking_client_) |
+ delete stacking_client_; |
+ if (views_delegate_) |
+ delete views_delegate_; |
+ aura::Env::DeleteInstance(); |
} |
void Shell::PlatformCleanUp() { |
} |
void Shell::PlatformEnableUIControl(UIControl control, bool is_enabled) { |
+ ShellWindowDelegateView* delegate_view = |
+ static_cast<ShellWindowDelegateView*>(window_widget_->widget_delegate()); |
+ if (control == BACK_BUTTON) { |
+ delegate_view->EnableUIControl(ShellWindowDelegateView::BACK_BUTTON, |
+ is_enabled); |
+ } else if (control == FORWARD_BUTTON) { |
+ delegate_view->EnableUIControl(ShellWindowDelegateView::FORWARD_BUTTON, |
+ is_enabled); |
+ } else if (control == STOP_BUTTON) { |
+ delegate_view->EnableUIControl(ShellWindowDelegateView::STOP_BUTTON, |
+ is_enabled); |
+ } |
} |
void Shell::PlatformSetAddressBarURL(const GURL& url) { |
+ ShellWindowDelegateView* delegate_view = |
+ static_cast<ShellWindowDelegateView*>(window_widget_->widget_delegate()); |
+ delegate_view->SetAddressBarURL(url); |
} |
void Shell::PlatformSetIsLoading(bool loading) { |
} |
void Shell::PlatformCreateWindow(int width, int height) { |
+ window_widget_ = |
+ views::Widget::CreateWindowWithBounds(new ShellWindowDelegateView(this), |
+ gfx::Rect(0, 0, width, height)); |
+ window_ = window_widget_->GetNativeWindow(); |
+ window_widget_->Show(); |
} |
void Shell::PlatformSetContents() { |
+ ShellWindowDelegateView* delegate_view = |
+ static_cast<ShellWindowDelegateView*>(window_widget_->widget_delegate()); |
+ delegate_view->SetWebContents(web_contents_.get()); |
} |
void Shell::PlatformResizeSubViews() { |
} |
void Shell::Close() { |
+ window_widget_->Close(); |
} |
void Shell::PlatformSetTitle(const string16& title) { |
+ ShellWindowDelegateView* delegate_view = |
+ static_cast<ShellWindowDelegateView*>(window_widget_->widget_delegate()); |
+ delegate_view->SetWindowTitle(title); |
+ window_widget_->UpdateWindowTitle(); |
} |
} // namespace content |