Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Unified Diff: ui/views/controls/webview/webview.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/webview/webview.h ('k') | ui/views/controls/webview/webview.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/webview/webview.cc
diff --git a/ui/views/controls/webview/webview.cc b/ui/views/controls/webview/webview.cc
deleted file mode 100644
index f17c534f4ac44c9d3cf04f412f45782285b13b4c..0000000000000000000000000000000000000000
--- a/ui/views/controls/webview/webview.cc
+++ /dev/null
@@ -1,375 +0,0 @@
-// Copyright (c) 2012 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 "ui/views/controls/webview/webview.h"
-
-#include "content/public/browser/browser_accessibility_state.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/navigation_controller.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/render_widget_host_view.h"
-#include "content/public/browser/web_contents.h"
-#include "ipc/ipc_message.h"
-#include "ui/accessibility/ax_enums.h"
-#include "ui/accessibility/ax_view_state.h"
-#include "ui/base/ui_base_switches_util.h"
-#include "ui/events/event.h"
-#include "ui/views/accessibility/native_view_accessibility.h"
-#include "ui/views/controls/native/native_view_host.h"
-#include "ui/views/focus/focus_manager.h"
-#include "ui/views/views_delegate.h"
-
-namespace views {
-
-// static
-const char WebView::kViewClassName[] = "WebView";
-
-////////////////////////////////////////////////////////////////////////////////
-// WebView, public:
-
-WebView::WebView(content::BrowserContext* browser_context)
- : holder_(new NativeViewHost()),
- embed_fullscreen_widget_mode_enabled_(false),
- is_embedding_fullscreen_widget_(false),
- browser_context_(browser_context),
- allow_accelerators_(false) {
- AddChildView(holder_); // Takes ownership of |holder_|.
- NativeViewAccessibility::RegisterWebView(this);
-}
-
-WebView::~WebView() {
- SetWebContents(NULL); // Make sure all necessary tear-down takes place.
- NativeViewAccessibility::UnregisterWebView(this);
-}
-
-content::WebContents* WebView::GetWebContents() {
- if (!web_contents()) {
- wc_owner_.reset(CreateWebContents(browser_context_));
- wc_owner_->SetDelegate(this);
- SetWebContents(wc_owner_.get());
- }
- return web_contents();
-}
-
-void WebView::SetWebContents(content::WebContents* replacement) {
- if (replacement == web_contents())
- return;
- DetachWebContents();
- WebContentsObserver::Observe(replacement);
- // web_contents() now returns |replacement| from here onwards.
- SetFocusable(!!web_contents());
- if (wc_owner_ != replacement)
- wc_owner_.reset();
- if (embed_fullscreen_widget_mode_enabled_) {
- is_embedding_fullscreen_widget_ =
- web_contents() && web_contents()->GetFullscreenRenderWidgetHostView();
- } else {
- DCHECK(!is_embedding_fullscreen_widget_);
- }
- AttachWebContents();
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::SetEmbedFullscreenWidgetMode(bool enable) {
- DCHECK(!web_contents())
- << "Cannot change mode while a WebContents is attached.";
- embed_fullscreen_widget_mode_enabled_ = enable;
-}
-
-void WebView::LoadInitialURL(const GURL& url) {
- GetWebContents()->GetController().LoadURL(
- url, content::Referrer(), ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
- std::string());
-}
-
-void WebView::SetFastResize(bool fast_resize) {
- holder_->set_fast_resize(fast_resize);
-}
-
-void WebView::OnWebContentsFocused(content::WebContents* web_contents) {
- FocusManager* focus_manager = GetFocusManager();
- if (focus_manager)
- focus_manager->SetFocusedView(this);
-}
-
-void WebView::SetPreferredSize(const gfx::Size& preferred_size) {
- preferred_size_ = preferred_size;
- PreferredSizeChanged();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WebView, View overrides:
-
-const char* WebView::GetClassName() const {
- return kViewClassName;
-}
-
-ui::TextInputClient* WebView::GetTextInputClient() {
- // This function delegates the text input handling to the underlying
- // content::RenderWidgetHostView. So when the underlying RWHV is destroyed or
- // replaced with another one, we have to notify the FocusManager through
- // FocusManager::OnTextInputClientChanged() that the focused TextInputClient
- // needs to be updated.
- if (switches::IsTextInputFocusManagerEnabled() &&
- web_contents() && !web_contents()->IsBeingDestroyed()) {
- content::RenderWidgetHostView* host_view =
- is_embedding_fullscreen_widget_ ?
- web_contents()->GetFullscreenRenderWidgetHostView() :
- web_contents()->GetRenderWidgetHostView();
- if (host_view)
- return host_view->GetTextInputClient();
- }
- return NULL;
-}
-
-scoped_ptr<content::WebContents> WebView::SwapWebContents(
- scoped_ptr<content::WebContents> new_web_contents) {
- if (wc_owner_)
- wc_owner_->SetDelegate(NULL);
- scoped_ptr<content::WebContents> old_web_contents(wc_owner_.Pass());
- wc_owner_ = new_web_contents.Pass();
- if (wc_owner_)
- wc_owner_->SetDelegate(this);
- SetWebContents(wc_owner_.get());
- return old_web_contents.Pass();
-}
-
-void WebView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
- // In most cases, the holder is simply sized to fill this WebView's bounds.
- // Only WebContentses that are in fullscreen mode and being screen-captured
- // will engage the special layout/sizing behavior.
- gfx::Rect holder_bounds(bounds().size());
- if (!embed_fullscreen_widget_mode_enabled_ ||
- !web_contents() ||
- web_contents()->GetCapturerCount() == 0 ||
- web_contents()->GetPreferredSize().IsEmpty() ||
- !(is_embedding_fullscreen_widget_ ||
- (web_contents()->GetDelegate() &&
- web_contents()->GetDelegate()->
- IsFullscreenForTabOrPending(web_contents())))) {
- holder_->SetBoundsRect(holder_bounds);
- return;
- }
-
- // Size the holder to the capture video resolution and center it. If this
- // WebView is not large enough to contain the holder at the preferred size,
- // scale down to fit (preserving aspect ratio).
- const gfx::Size capture_size = web_contents()->GetPreferredSize();
- if (capture_size.width() <= holder_bounds.width() &&
- capture_size.height() <= holder_bounds.height()) {
- // No scaling, just centering.
- holder_bounds.ClampToCenteredSize(capture_size);
- } else {
- // Scale down, preserving aspect ratio, and center.
- // TODO(miu): This is basically media::ComputeLetterboxRegion(), and it
- // looks like others have written this code elsewhere. Let's considate
- // into a shared function ui/gfx/geometry or around there.
- const int64 x = static_cast<int64>(capture_size.width()) *
- holder_bounds.height();
- const int64 y = static_cast<int64>(capture_size.height()) *
- holder_bounds.width();
- if (y < x) {
- holder_bounds.ClampToCenteredSize(gfx::Size(
- holder_bounds.width(), static_cast<int>(y / capture_size.width())));
- } else {
- holder_bounds.ClampToCenteredSize(gfx::Size(
- static_cast<int>(x / capture_size.height()), holder_bounds.height()));
- }
- }
-
- holder_->SetBoundsRect(holder_bounds);
-}
-
-void WebView::ViewHierarchyChanged(
- const ViewHierarchyChangedDetails& details) {
- if (details.is_add)
- AttachWebContents();
-}
-
-bool WebView::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
- if (allow_accelerators_)
- return FocusManager::IsTabTraversalKeyEvent(event);
-
- // Don't look-up accelerators or tab-traversal if we are showing a non-crashed
- // TabContents.
- // We'll first give the page a chance to process the key events. If it does
- // not process them, they'll be returned to us and we'll treat them as
- // accelerators then.
- return web_contents() && !web_contents()->IsCrashed();
-}
-
-void WebView::OnFocus() {
- if (web_contents())
- web_contents()->Focus();
-}
-
-void WebView::AboutToRequestFocusFromTabTraversal(bool reverse) {
- if (web_contents())
- web_contents()->FocusThroughTabTraversal(reverse);
-}
-
-void WebView::GetAccessibleState(ui::AXViewState* state) {
- state->role = ui::AX_ROLE_GROUP;
-}
-
-gfx::NativeViewAccessible WebView::GetNativeViewAccessible() {
- if (web_contents()) {
- content::RenderWidgetHostView* host_view =
- web_contents()->GetRenderWidgetHostView();
- if (host_view)
- return host_view->GetNativeViewAccessible();
- }
- return View::GetNativeViewAccessible();
-}
-
-gfx::Size WebView::GetPreferredSize() const {
- if (preferred_size_ == gfx::Size())
- return View::GetPreferredSize();
- else
- return preferred_size_;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WebView, content::WebContentsDelegate implementation:
-
-void WebView::WebContentsFocused(content::WebContents* web_contents) {
- DCHECK(wc_owner_.get());
- // The WebView is only the delegate of WebContentses it creates itself.
- OnWebContentsFocused(wc_owner_.get());
-}
-
-bool WebView::EmbedsFullscreenWidget() const {
- DCHECK(wc_owner_.get());
- return embed_fullscreen_widget_mode_enabled_;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WebView, content::WebContentsObserver implementation:
-
-void WebView::RenderViewDeleted(content::RenderViewHost* render_view_host) {
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::RenderProcessGone(base::TerminationStatus status) {
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::RenderViewHostChanged(content::RenderViewHost* old_host,
- content::RenderViewHost* new_host) {
- FocusManager* const focus_manager = GetFocusManager();
- if (focus_manager && focus_manager->GetFocusedView() == this)
- OnFocus();
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::DidShowFullscreenWidget(int routing_id) {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(true);
-}
-
-void WebView::DidDestroyFullscreenWidget(int routing_id) {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(false);
-}
-
-void WebView::DidToggleFullscreenModeForTab(bool entered_fullscreen) {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(entered_fullscreen);
-}
-
-void WebView::DidAttachInterstitialPage() {
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::DidDetachInterstitialPage() {
- NotifyMaybeTextInputClientChanged();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WebView, private:
-
-void WebView::AttachWebContents() {
- // Prevents attachment if the WebView isn't already in a Widget, or it's
- // already attached.
- if (!GetWidget() || !web_contents())
- return;
-
- const gfx::NativeView view_to_attach = is_embedding_fullscreen_widget_ ?
- web_contents()->GetFullscreenRenderWidgetHostView()->GetNativeView() :
- web_contents()->GetNativeView();
- OnBoundsChanged(bounds());
- if (holder_->native_view() == view_to_attach)
- return;
-
- holder_->Attach(view_to_attach);
-
- // The view will not be focused automatically when it is attached, so we need
- // to pass on focus to it if the FocusManager thinks the view is focused. Note
- // that not every Widget has a focus manager.
- FocusManager* const focus_manager = GetFocusManager();
- if (focus_manager && focus_manager->GetFocusedView() == this)
- OnFocus();
-
-#if defined(OS_WIN)
- if (!is_embedding_fullscreen_widget_) {
- web_contents()->SetParentNativeViewAccessible(
- parent()->GetNativeViewAccessible());
- }
-#endif
-}
-
-void WebView::DetachWebContents() {
- if (web_contents()) {
- holder_->Detach();
-#if defined(OS_WIN)
- if (!is_embedding_fullscreen_widget_)
- web_contents()->SetParentNativeViewAccessible(NULL);
-#endif
- }
-}
-
-void WebView::ReattachForFullscreenChange(bool enter_fullscreen) {
- DCHECK(embed_fullscreen_widget_mode_enabled_);
- const bool web_contents_has_separate_fs_widget =
- web_contents() && web_contents()->GetFullscreenRenderWidgetHostView();
- if (is_embedding_fullscreen_widget_ || web_contents_has_separate_fs_widget) {
- // Shutting down or starting up the embedding of the separate fullscreen
- // widget. Need to detach and re-attach to a different native view.
- DetachWebContents();
- is_embedding_fullscreen_widget_ =
- enter_fullscreen && web_contents_has_separate_fs_widget;
- AttachWebContents();
- } else {
- // Entering or exiting "non-Flash" fullscreen mode, where the native view is
- // the same. So, do not change attachment.
- OnBoundsChanged(bounds());
- }
- NotifyMaybeTextInputClientChanged();
-}
-
-void WebView::NotifyMaybeTextInputClientChanged() {
- // Update the TextInputClient as needed; see GetTextInputClient().
- FocusManager* const focus_manager = GetFocusManager();
- if (focus_manager)
- focus_manager->OnTextInputClientChanged(this);
-}
-
-content::WebContents* WebView::CreateWebContents(
- content::BrowserContext* browser_context) {
- content::WebContents* contents = NULL;
- if (ViewsDelegate::views_delegate) {
- contents = ViewsDelegate::views_delegate->CreateWebContents(
- browser_context, NULL);
- }
-
- if (!contents) {
- content::WebContents::CreateParams create_params(
- browser_context, NULL);
- return content::WebContents::Create(create_params);
- }
-
- return contents;
-}
-
-} // namespace views
« no previous file with comments | « ui/views/controls/webview/webview.h ('k') | ui/views/controls/webview/webview.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698