summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhanxi@chromium.org <hanxi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-21 04:45:43 +0000
committerhanxi@chromium.org <hanxi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-21 04:47:00 +0000
commitcd010dbc1edf8ce6cae0e40896a1492ce1c0158c (patch)
tree0127034ed285e50937c6bb20429adb23b85a7dba
parent27e20293ff3f36a254cee1449866e4c4c87e6911 (diff)
downloadchromium_src-cd010dbc1edf8ce6cae0e40896a1492ce1c0158c.zip
chromium_src-cd010dbc1edf8ce6cae0e40896a1492ce1c0158c.tar.gz
chromium_src-cd010dbc1edf8ce6cae0e40896a1492ce1c0158c.tar.bz2
Introduce WebViewGuestDelegate.
BUG=352290 Review URL: https://codereview.chromium.org/481003002 Cr-Commit-Position: refs/heads/master@{#291002} git-svn-id: svn://svn.chromium.org/chrome/trunk/src@291002 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc204
-rw-r--r--chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h85
-rw-r--r--chrome/browser/guest_view/web_view/web_view_guest.cc187
-rw-r--r--chrome/browser/guest_view/web_view/web_view_guest.h52
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--extensions/browser/guest_view/DEPS3
-rw-r--r--extensions/browser/guest_view/web_view/web_view_guest_delegate.cc15
-rw-r--r--extensions/browser/guest_view/web_view/web_view_guest_delegate.h66
-rw-r--r--extensions/extensions.gyp2
9 files changed, 410 insertions, 206 deletions
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc
new file mode 100644
index 0000000..8175022
--- /dev/null
+++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc
@@ -0,0 +1,204 @@
+// Copyright 2014 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/guest_view/web_view/chrome_web_view_guest_delegate.h"
+
+#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
+#include "chrome/browser/favicon/favicon_tab_helper.h"
+#include "chrome/browser/guest_view/web_view/web_view_constants.h"
+#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
+#include "chrome/browser/ui/pdf/pdf_tab_helper.h"
+#include "chrome/browser/ui/zoom/zoom_controller.h"
+#include "chrome/common/chrome_version_info.h"
+#include "components/renderer_context_menu/context_menu_delegate.h"
+#include "content/public/common/page_zoom.h"
+
+#if defined(ENABLE_PRINTING)
+#if defined(ENABLE_FULL_PRINTING)
+#include "chrome/browser/printing/print_preview_message_handler.h"
+#include "chrome/browser/printing/print_view_manager.h"
+#else
+#include "chrome/browser/printing/print_view_manager_basic.h"
+#endif // defined(ENABLE_FULL_PRINTING)
+#endif // defined(ENABLE_PRINTING)
+
+ChromeWebViewGuestDelegate::ChromeWebViewGuestDelegate(
+ extensions::WebViewGuest* web_view_guest)
+ : WebViewGuestDelegate(),
+ pending_context_menu_request_id_(0),
+ chromevox_injected_(false),
+ current_zoom_factor_(1.0),
+ web_view_guest_(web_view_guest) {
+}
+
+ChromeWebViewGuestDelegate::~ChromeWebViewGuestDelegate() {
+}
+
+double ChromeWebViewGuestDelegate::GetZoom() {
+ return current_zoom_factor_;
+}
+
+bool ChromeWebViewGuestDelegate::HandleContextMenu(
+ const content::ContextMenuParams& params) {
+ ContextMenuDelegate* menu_delegate =
+ ContextMenuDelegate::FromWebContents(guest_web_contents());
+ DCHECK(menu_delegate);
+
+ pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), params);
+
+ // Pass it to embedder.
+ int request_id = ++pending_context_menu_request_id_;
+ scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
+ scoped_ptr<base::ListValue> items =
+ MenuModelToValue(pending_menu_->menu_model());
+ args->Set(webview::kContextMenuItems, items.release());
+ args->SetInteger(webview::kRequestId, request_id);
+ web_view_guest_->DispatchEventToEmbedder(
+ new extensions::GuestViewBase::Event(
+ webview::kEventContextMenu, args.Pass()));
+ return true;
+}
+
+// TODO(hanxi) Investigate which of these observers should move to the
+// extension module in the future.
+void ChromeWebViewGuestDelegate::OnAttachWebViewHelpers(
+ content::WebContents* contents) {
+ // Create a zoom controller for the guest contents give it access to
+ // GetZoomLevel() and and SetZoomLevel() in WebViewGuest.
+ // TODO(wjmaclean) This currently uses the same HostZoomMap as the browser
+ // context, but we eventually want to isolate the guest contents from zoom
+ // changes outside the guest (e.g. in the main browser), so we should
+ // create a separate HostZoomMap for the guest.
+ ZoomController::CreateForWebContents(contents);
+
+ FaviconTabHelper::CreateForWebContents(contents);
+ extensions::ChromeExtensionWebContentsObserver::
+ CreateForWebContents(contents);
+#if defined(ENABLE_PRINTING)
+#if defined(ENABLE_FULL_PRINTING)
+ printing::PrintViewManager::CreateForWebContents(contents);
+ printing::PrintPreviewMessageHandler::CreateForWebContents(contents);
+#else
+ printing::PrintViewManagerBasic::CreateForWebContents(contents);
+#endif // defined(ENABLE_FULL_PRINTING)
+#endif // defined(ENABLE_PRINTING)
+ PDFTabHelper::CreateForWebContents(contents);
+}
+
+void ChromeWebViewGuestDelegate::OnDidCommitProvisionalLoadForFrame(
+ bool is_main_frame) {
+ // Update the current zoom factor for the new page.
+ ZoomController* zoom_controller =
+ ZoomController::FromWebContents(guest_web_contents());
+ DCHECK(zoom_controller);
+ current_zoom_factor_ = zoom_controller->GetZoomLevel();
+ if (is_main_frame)
+ chromevox_injected_ = false;
+}
+
+void ChromeWebViewGuestDelegate::OnDidInitialize() {
+#if defined(OS_CHROMEOS)
+ chromeos::AccessibilityManager* accessibility_manager =
+ chromeos::AccessibilityManager::Get();
+ CHECK(accessibility_manager);
+ accessibility_subscription_ = accessibility_manager->RegisterCallback(
+ base::Bind(&ChromeWebViewGuestDelegate::OnAccessibilityStatusChanged,
+ base::Unretained(this)));
+#endif
+}
+
+void ChromeWebViewGuestDelegate::OnDocumentLoadedInFrame(
+ content::RenderFrameHost* render_frame_host) {
+ if (!render_frame_host->GetParent())
+ InjectChromeVoxIfNeeded(render_frame_host->GetRenderViewHost());
+}
+
+void ChromeWebViewGuestDelegate::OnGuestDestroyed() {
+ // Clean up custom context menu items for this guest.
+ extensions::MenuManager* menu_manager = extensions::MenuManager::Get(
+ Profile::FromBrowserContext(web_view_guest_->browser_context()));
+ menu_manager->RemoveAllContextItems(extensions::MenuItem::ExtensionKey(
+ web_view_guest_->embedder_extension_id(),
+ web_view_guest_->view_instance_id()));
+}
+
+// static
+scoped_ptr<base::ListValue> ChromeWebViewGuestDelegate::MenuModelToValue(
+ const ui::SimpleMenuModel& menu_model) {
+ scoped_ptr<base::ListValue> items(new base::ListValue());
+ for (int i = 0; i < menu_model.GetItemCount(); ++i) {
+ base::DictionaryValue* item_value = new base::DictionaryValue();
+ // TODO(lazyboy): We need to expose some kind of enum equivalent of
+ // |command_id| instead of plain integers.
+ item_value->SetInteger(webview::kMenuItemCommandId,
+ menu_model.GetCommandIdAt(i));
+ item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i));
+ items->Append(item_value);
+ }
+ return items.Pass();
+}
+
+void ChromeWebViewGuestDelegate::OnSetZoom(double zoom_factor) {
+ ZoomController* zoom_controller =
+ ZoomController::FromWebContents(guest_web_contents());
+ DCHECK(zoom_controller);
+ double zoom_level = content::ZoomFactorToZoomLevel(zoom_factor);
+ zoom_controller->SetZoomLevel(zoom_level);
+
+ scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
+ args->SetDouble(webview::kOldZoomFactor, current_zoom_factor_);
+ args->SetDouble(webview::kNewZoomFactor, zoom_factor);
+ web_view_guest_->DispatchEventToEmbedder(
+ new extensions::GuestViewBase::Event(
+ webview::kEventZoomChange, args.Pass()));
+ current_zoom_factor_ = zoom_factor;
+}
+
+void ChromeWebViewGuestDelegate::OnShowContextMenu(
+ int request_id,
+ const MenuItemVector* items) {
+ if (!pending_menu_.get())
+ return;
+
+ // Make sure this was the correct request.
+ if (request_id != pending_context_menu_request_id_)
+ return;
+
+ // TODO(lazyboy): Implement.
+ DCHECK(!items);
+
+ ContextMenuDelegate* menu_delegate =
+ ContextMenuDelegate::FromWebContents(guest_web_contents());
+ menu_delegate->ShowMenu(pending_menu_.Pass());
+}
+
+void ChromeWebViewGuestDelegate::InjectChromeVoxIfNeeded(
+ content::RenderViewHost* render_view_host) {
+#if defined(OS_CHROMEOS)
+ if (!chromevox_injected_) {
+ chromeos::AccessibilityManager* manager =
+ chromeos::AccessibilityManager::Get();
+ if (manager && manager->IsSpokenFeedbackEnabled()) {
+ manager->InjectChromeVox(render_view_host);
+ chromevox_injected_ = true;
+ }
+ }
+#endif
+}
+
+#if defined(OS_CHROMEOS)
+void ChromeWebViewGuestDelegate::OnAccessibilityStatusChanged(
+ const chromeos::AccessibilityStatusEventDetails& details) {
+ if (details.notification_type == chromeos::ACCESSIBILITY_MANAGER_SHUTDOWN) {
+ accessibility_subscription_.reset();
+ } else if (details.notification_type ==
+ chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) {
+ if (details.enabled)
+ InjectChromeVoxIfNeeded(guest_web_contents()->GetRenderViewHost());
+ else
+ chromevox_injected_ = false;
+ }
+}
+#endif
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h
new file mode 100644
index 0000000..6c1901a
--- /dev/null
+++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h
@@ -0,0 +1,85 @@
+// Copyright 2014 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_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_
+#define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_
+
+#include "chrome/browser/guest_view/web_view/web_view_guest.h"
+#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
+#endif
+
+class RenderViewContextMenu;
+
+namespace ui {
+class SimpleMenuModel;
+} // namespace ui
+
+class ChromeWebViewGuestDelegate : public extensions::WebViewGuestDelegate {
+ public :
+ explicit ChromeWebViewGuestDelegate(
+ extensions::WebViewGuest* web_view_guest);
+ virtual ~ChromeWebViewGuestDelegate();
+
+ // WebViewGuestDelegate implementation.
+ virtual double GetZoom() OVERRIDE;
+ virtual bool HandleContextMenu(
+ const content::ContextMenuParams& params) OVERRIDE;
+ virtual void OnAttachWebViewHelpers(content::WebContents* contents) OVERRIDE;
+ virtual void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) OVERRIDE;
+ virtual void OnDidInitialize() OVERRIDE;
+ virtual void OnDocumentLoadedInFrame(
+ content::RenderFrameHost* render_frame_host) OVERRIDE;
+ virtual void OnGuestDestroyed() OVERRIDE;
+ virtual void OnSetZoom(double zoom_factor) OVERRIDE;
+ virtual void OnShowContextMenu(
+ int request_id,
+ const MenuItemVector* items) OVERRIDE;
+
+ private:
+ content::WebContents* guest_web_contents() const {
+ return web_view_guest_->guest_web_contents();
+ }
+
+ // Returns the top level items (ignoring submenus) as Value.
+ static scoped_ptr<base::ListValue> MenuModelToValue(
+ const ui::SimpleMenuModel& menu_model);
+
+ void InjectChromeVoxIfNeeded(content::RenderViewHost* render_view_host);
+
+#if defined(OS_CHROMEOS)
+ // Notification of a change in the state of an accessibility setting.
+ void OnAccessibilityStatusChanged(
+ const chromeos::AccessibilityStatusEventDetails& details);
+#endif
+
+ // A counter to generate a unique request id for a context menu request.
+ // We only need the ids to be unique for a given WebViewGuest.
+ int pending_context_menu_request_id_;
+
+ // Set to |true| if ChromeVox was already injected in main frame.
+ bool chromevox_injected_;
+
+ // Stores the current zoom factor.
+ double current_zoom_factor_;
+
+ // Holds the RenderViewContextMenu that has been built but yet to be
+ // shown. This is .Reset() after ShowContextMenu().
+ scoped_ptr<RenderViewContextMenu> pending_menu_;
+
+ extensions::WebViewGuest* web_view_guest_;
+
+#if defined(OS_CHROMEOS)
+ // Subscription to receive notifications on changes to a11y settings.
+ scoped_ptr<chromeos::AccessibilityStatusSubscription>
+ accessibility_subscription_;
+#endif
+
+ DISALLOW_COPY_AND_ASSIGN(ChromeWebViewGuestDelegate);
+};
+
+#endif // CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_
+
diff --git a/chrome/browser/guest_view/web_view/web_view_guest.cc b/chrome/browser/guest_view/web_view/web_view_guest.cc
index 504e799..cc241d9 100644
--- a/chrome/browser/guest_view/web_view/web_view_guest.cc
+++ b/chrome/browser/guest_view/web_view/web_view_guest.cc
@@ -7,22 +7,13 @@
#include "base/message_loop/message_loop.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/api/web_request/web_request_api.h"
#include "chrome/browser/extensions/api/web_view/web_view_internal_api.h"
-#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
-#include "chrome/browser/extensions/menu_manager.h"
-#include "chrome/browser/favicon/favicon_tab_helper.h"
+#include "chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h"
#include "chrome/browser/guest_view/web_view/web_view_constants.h"
#include "chrome/browser/guest_view/web_view/web_view_permission_helper.h"
#include "chrome/browser/guest_view/web_view/web_view_permission_types.h"
#include "chrome/browser/guest_view/web_view/web_view_renderer_state.h"
-#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
-#include "chrome/browser/ui/pdf/pdf_tab_helper.h"
-#include "chrome/browser/ui/zoom/zoom_controller.h"
-#include "chrome/common/chrome_version_info.h"
-#include "chrome/common/render_messages.h"
-#include "components/renderer_context_menu/context_menu_delegate.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/native_web_keyboard_event.h"
@@ -55,19 +46,6 @@
#include "third_party/WebKit/public/web/WebFindOptions.h"
#include "ui/base/models/simple_menu_model.h"
-#if defined(ENABLE_PRINTING)
-#if defined(ENABLE_FULL_PRINTING)
-#include "chrome/browser/printing/print_preview_message_handler.h"
-#include "chrome/browser/printing/print_view_manager.h"
-#else
-#include "chrome/browser/printing/print_view_manager_basic.h"
-#endif // defined(ENABLE_FULL_PRINTING)
-#endif // defined(ENABLE_PRINTING)
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
-#endif
-
using base::UserMetricsAction;
using content::RenderFrameHost;
using content::ResourceType;
@@ -209,22 +187,6 @@ int WebViewGuest::GetViewInstanceId(WebContents* contents) {
return guest->view_instance_id();
}
-// static
-scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue(
- const ui::SimpleMenuModel& menu_model) {
- scoped_ptr<base::ListValue> items(new base::ListValue());
- for (int i = 0; i < menu_model.GetItemCount(); ++i) {
- base::DictionaryValue* item_value = new base::DictionaryValue();
- // TODO(lazyboy): We need to expose some kind of enum equivalent of
- // |command_id| instead of plain integers.
- item_value->SetInteger(webview::kMenuItemCommandId,
- menu_model.GetCommandIdAt(i));
- item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i));
- items->Append(item_value);
- }
- return items.Pass();
-}
-
const char* WebViewGuest::GetAPINamespace() {
return webview::kAPINamespace;
}
@@ -345,38 +307,14 @@ void WebViewGuest::DidInitialize() {
this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT,
content::Source<WebContents>(guest_web_contents()));
-#if defined(OS_CHROMEOS)
- chromeos::AccessibilityManager* accessibility_manager =
- chromeos::AccessibilityManager::Get();
- CHECK(accessibility_manager);
- accessibility_subscription_ = accessibility_manager->RegisterCallback(
- base::Bind(&WebViewGuest::OnAccessibilityStatusChanged,
- base::Unretained(this)));
-#endif
-
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnDidInitialize();
AttachWebViewHelpers(guest_web_contents());
}
void WebViewGuest::AttachWebViewHelpers(WebContents* contents) {
- // Create a zoom controller for the guest contents give it access to
- // GetZoomLevel() and and SetZoomLevel() in WebViewGuest.
- // TODO(wjmaclean) This currently uses the same HostZoomMap as the browser
- // context, but we eventually want to isolate the guest contents from zoom
- // changes outside the guest (e.g. in the main browser), so we should
- // create a separate HostZoomMap for the guest.
- ZoomController::CreateForWebContents(contents);
-
- FaviconTabHelper::CreateForWebContents(contents);
- ChromeExtensionWebContentsObserver::CreateForWebContents(contents);
-#if defined(ENABLE_PRINTING)
-#if defined(ENABLE_FULL_PRINTING)
- printing::PrintViewManager::CreateForWebContents(contents);
- printing::PrintPreviewMessageHandler::CreateForWebContents(contents);
-#else
- printing::PrintViewManagerBasic::CreateForWebContents(contents);
-#endif // defined(ENABLE_FULL_PRINTING)
-#endif // defined(ENABLE_PRINTING)
- PDFTabHelper::CreateForWebContents(contents);
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnAttachWebViewHelpers(contents);
web_view_permission_helper_.reset(new WebViewPermissionHelper(this));
}
@@ -406,11 +344,8 @@ void WebViewGuest::EmbedderDestroyed() {
void WebViewGuest::GuestDestroyed() {
// Clean up custom context menu items for this guest.
- MenuManager* menu_manager = MenuManager::Get(
- Profile::FromBrowserContext(browser_context()));
- menu_manager->RemoveAllContextItems(MenuItem::ExtensionKey(
- embedder_extension_id(), view_instance_id()));
-
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnGuestDestroyed();
RemoveWebViewStateFromIOThread(web_contents());
}
@@ -480,22 +415,9 @@ void WebViewGuest::FindReply(WebContents* source,
bool WebViewGuest::HandleContextMenu(
const content::ContextMenuParams& params) {
- ContextMenuDelegate* menu_delegate =
- ContextMenuDelegate::FromWebContents(guest_web_contents());
- DCHECK(menu_delegate);
-
- pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), params);
-
- // Pass it to embedder.
- int request_id = ++pending_context_menu_request_id_;
- scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
- scoped_ptr<base::ListValue> items =
- MenuModelToValue(pending_menu_->menu_model());
- args->Set(webview::kContextMenuItems, items.release());
- args->SetInteger(webview::kRequestId, request_id);
- DispatchEventToEmbedder(
- new GuestViewBase::Event(webview::kEventContextMenu, args.Pass()));
- return true;
+ if (!web_view_guest_delegate_)
+ return false;
+ return web_view_guest_delegate_->HandleContextMenu(params);
}
void WebViewGuest::HandleKeyboardEvent(
@@ -634,7 +556,9 @@ void WebViewGuest::Observe(int type,
}
double WebViewGuest::GetZoom() {
- return current_zoom_factor_;
+ if (!web_view_guest_delegate_)
+ return 1.0;
+ return web_view_guest_delegate_->GetZoom();
}
void WebViewGuest::Find(
@@ -709,12 +633,10 @@ bool WebViewGuest::ClearData(const base::Time remove_since,
WebViewGuest::WebViewGuest(content::BrowserContext* browser_context,
int guest_instance_id)
: GuestView<WebViewGuest>(browser_context, guest_instance_id),
- pending_context_menu_request_id_(0),
is_overriding_user_agent_(false),
- chromevox_injected_(false),
- current_zoom_factor_(1.0),
find_helper_(this),
javascript_dialog_helper_(this) {
+ web_view_guest_delegate_.reset(new ChromeWebViewGuestDelegate(this));
}
WebViewGuest::~WebViewGuest() {
@@ -737,15 +659,10 @@ void WebViewGuest::DidCommitProvisionalLoadForFrame(
guest_web_contents()->GetRenderProcessHost()->GetID());
DispatchEventToEmbedder(
new GuestViewBase::Event(webview::kEventLoadCommit, args.Pass()));
-
- // Update the current zoom factor for the new page.
- ZoomController* zoom_controller =
- ZoomController::FromWebContents(guest_web_contents());
- DCHECK(zoom_controller);
- current_zoom_factor_ = zoom_controller->GetZoomLevel();
-
- if (!render_frame_host->GetParent())
- chromevox_injected_ = false;
+ if (web_view_guest_delegate_) {
+ web_view_guest_delegate_->OnDidCommitProvisionalLoadForFrame(
+ !render_frame_host->GetParent());
+ }
}
void WebViewGuest::DidFailProvisionalLoad(
@@ -771,8 +688,8 @@ void WebViewGuest::DidStartProvisionalLoadForFrame(
void WebViewGuest::DocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) {
- if (!render_frame_host->GetParent())
- InjectChromeVoxIfNeeded(render_frame_host->GetRenderViewHost());
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnDocumentLoadedInFrame(render_frame_host);
}
bool WebViewGuest::OnMessageReceived(const IPC::Message& message,
@@ -975,35 +892,6 @@ void WebViewGuest::NavigateGuest(const std::string& src) {
guest_web_contents());
}
-#if defined(OS_CHROMEOS)
-void WebViewGuest::OnAccessibilityStatusChanged(
- const chromeos::AccessibilityStatusEventDetails& details) {
- if (details.notification_type == chromeos::ACCESSIBILITY_MANAGER_SHUTDOWN) {
- accessibility_subscription_.reset();
- } else if (details.notification_type ==
- chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) {
- if (details.enabled)
- InjectChromeVoxIfNeeded(guest_web_contents()->GetRenderViewHost());
- else
- chromevox_injected_ = false;
- }
-}
-#endif
-
-void WebViewGuest::InjectChromeVoxIfNeeded(
- content::RenderViewHost* render_view_host) {
-#if defined(OS_CHROMEOS)
- if (!chromevox_injected_) {
- chromeos::AccessibilityManager* manager =
- chromeos::AccessibilityManager::Get();
- if (manager && manager->IsSpokenFeedbackEnabled()) {
- manager->InjectChromeVox(render_view_host);
- chromevox_injected_ = true;
- }
- }
-#endif
-}
-
bool WebViewGuest::HandleKeyboardShortcuts(
const content::NativeWebKeyboardEvent& event) {
if (event.type != blink::WebInputEvent::RawKeyDown)
@@ -1066,21 +954,11 @@ void WebViewGuest::SetUpAutoSize() {
gfx::Size(max_width, max_height));
}
-void WebViewGuest::ShowContextMenu(int request_id,
- const MenuItemVector* items) {
- if (!pending_menu_.get())
- return;
-
- // Make sure this was the correct request.
- if (request_id != pending_context_menu_request_id_)
- return;
-
- // TODO(lazyboy): Implement.
- DCHECK(!items);
-
- ContextMenuDelegate* menu_delegate =
- ContextMenuDelegate::FromWebContents(guest_web_contents());
- menu_delegate->ShowMenu(pending_menu_.Pass());
+void WebViewGuest::ShowContextMenu(
+ int request_id,
+ const WebViewGuestDelegate::MenuItemVector* items) {
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnShowContextMenu(request_id, items);
}
void WebViewGuest::SetName(const std::string& name) {
@@ -1092,19 +970,8 @@ void WebViewGuest::SetName(const std::string& name) {
}
void WebViewGuest::SetZoom(double zoom_factor) {
- ZoomController* zoom_controller =
- ZoomController::FromWebContents(guest_web_contents());
- DCHECK(zoom_controller);
- double zoom_level = content::ZoomFactorToZoomLevel(zoom_factor);
- zoom_controller->SetZoomLevel(zoom_level);
-
- scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
- args->SetDouble(webview::kOldZoomFactor, current_zoom_factor_);
- args->SetDouble(webview::kNewZoomFactor, zoom_factor);
- DispatchEventToEmbedder(
- new GuestViewBase::Event(webview::kEventZoomChange, args.Pass()));
-
- current_zoom_factor_ = zoom_factor;
+ if (web_view_guest_delegate_)
+ web_view_guest_delegate_->OnSetZoom(zoom_factor);
}
void WebViewGuest::AddNewContents(content::WebContents* source,
diff --git a/chrome/browser/guest_view/web_view/web_view_guest.h b/chrome/browser/guest_view/web_view/web_view_guest.h
index dd9bb86..e409caf 100644
--- a/chrome/browser/guest_view/web_view/web_view_guest.h
+++ b/chrome/browser/guest_view/web_view/web_view_guest.h
@@ -17,23 +17,12 @@
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/guest_view/guest_view.h"
+#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
#include "extensions/browser/script_executor.h"
#include "third_party/WebKit/public/web/WebFindOptions.h"
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
-#endif
-
-class RenderViewContextMenu;
-
-namespace ui {
-class SimpleMenuModel;
-} // namespace ui
-
namespace extensions {
-namespace webview_api = api::web_view_internal;
-
class WebViewInternalFindFunction;
// A WebViewGuest provides the browser-side implementation of the <webview> API
@@ -69,12 +58,13 @@ class WebViewGuest : public GuestView<WebViewGuest>,
// Request navigating the guest to the provided |src| URL.
void NavigateGuest(const std::string& src);
- typedef std::vector<linked_ptr<webview_api::ContextMenuItem> > MenuItemVector;
// Shows the context menu for the guest.
// |items| acts as a filter. This restricts the current context's default
// menu items to contain only the items from |items|.
// |items| == NULL means no filtering will be applied.
- void ShowContextMenu(int request_id, const MenuItemVector* items);
+ void ShowContextMenu(
+ int request_id,
+ const WebViewGuestDelegate::MenuItemVector* items);
// Sets the frame name of the guest.
void SetName(const std::string& name);
@@ -243,10 +233,6 @@ class WebViewGuest : public GuestView<WebViewGuest>,
virtual ~WebViewGuest();
- // Returns the top level items (ignoring submenus) as Value.
- static scoped_ptr<base::ListValue> MenuModelToValue(
- const ui::SimpleMenuModel& menu_model);
-
void AttachWebViewHelpers(content::WebContents* contents);
void OnWebViewNewWindowResponse(int new_window_instance_id,
@@ -291,14 +277,6 @@ class WebViewGuest : public GuestView<WebViewGuest>,
static void RemoveWebViewStateFromIOThread(
content::WebContents* web_contents);
-#if defined(OS_CHROMEOS)
- // Notification of a change in the state of an accessibility setting.
- void OnAccessibilityStatusChanged(
- const chromeos::AccessibilityStatusEventDetails& details);
-#endif
-
- void InjectChromeVoxIfNeeded(content::RenderViewHost* render_view_host);
-
void LoadURLWithParams(const GURL& url,
const content::Referrer& referrer,
content::PageTransition transition_type,
@@ -340,19 +318,9 @@ class WebViewGuest : public GuestView<WebViewGuest>,
content::NotificationRegistrar notification_registrar_;
- // A counter to generate a unique request id for a context menu request.
- // We only need the ids to be unique for a given WebViewGuest.
- int pending_context_menu_request_id_;
-
// True if the user agent is overridden.
bool is_overriding_user_agent_;
- // Set to |true| if ChromeVox was already injected in main frame.
- bool chromevox_injected_;
-
- // Stores the current zoom factor.
- double current_zoom_factor_;
-
// Stores the window name of the main frame of the guest.
std::string name_;
@@ -365,19 +333,11 @@ class WebViewGuest : public GuestView<WebViewGuest>,
// Handels permission requests.
scoped_ptr<WebViewPermissionHelper> web_view_permission_helper_;
+ scoped_ptr<WebViewGuestDelegate> web_view_guest_delegate_;
+
friend void WebViewFindHelper::DispatchFindUpdateEvent(bool canceled,
bool final_update);
- // Holds the RenderViewContextMenu that has been built but yet to be
- // shown. This is .Reset() after ShowContextMenu().
- scoped_ptr<RenderViewContextMenu> pending_menu_;
-
-#if defined(OS_CHROMEOS)
- // Subscription to receive notifications on changes to a11y settings.
- scoped_ptr<chromeos::AccessibilityStatusSubscription>
- accessibility_subscription_;
-#endif
-
// Tracks the name, and target URL of the new window. Once the first
// navigation commits, we no longer track this information.
struct NewWindowInfo {
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 2df0bdf..3e314ea 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1486,6 +1486,8 @@
'browser/guest_view/extension_options/extension_options_guest.h',
'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc',
'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h',
+ 'browser/guest_view/web_view/chrome_web_view_guest_delegate.cc',
+ 'browser/guest_view/web_view/chrome_web_view_guest_delegate.h',
'browser/guest_view/web_view/context_menu_content_type_web_view.cc',
'browser/guest_view/web_view/context_menu_content_type_web_view.h',
'browser/guest_view/web_view/javascript_dialog_helper.cc',
diff --git a/extensions/browser/guest_view/DEPS b/extensions/browser/guest_view/DEPS
new file mode 100644
index 0000000..0573d42
--- /dev/null
+++ b/extensions/browser/guest_view/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+chrome/common/extensions/api/web_view_internal.h"
+]
diff --git a/extensions/browser/guest_view/web_view/web_view_guest_delegate.cc b/extensions/browser/guest_view/web_view/web_view_guest_delegate.cc
new file mode 100644
index 0000000..d651212
--- /dev/null
+++ b/extensions/browser/guest_view/web_view/web_view_guest_delegate.cc
@@ -0,0 +1,15 @@
+// Copyright 2014 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 "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
+
+namespace extensions {
+
+WebViewGuestDelegate::WebViewGuestDelegate() {
+}
+
+WebViewGuestDelegate::~WebViewGuestDelegate() {
+}
+
+} // namespace extensions
diff --git a/extensions/browser/guest_view/web_view/web_view_guest_delegate.h b/extensions/browser/guest_view/web_view/web_view_guest_delegate.h
new file mode 100644
index 0000000..01152b0
--- /dev/null
+++ b/extensions/browser/guest_view/web_view/web_view_guest_delegate.h
@@ -0,0 +1,66 @@
+// Copyright 2014 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 EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_DELEGATE_H_
+#define EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_DELEGATE_H_
+
+#include "chrome/common/extensions/api/web_view_internal.h"
+#include "extensions/browser/guest_view/guest_view_base.h"
+
+namespace content {
+class RenderViewHost;
+class WebContents;
+}
+
+namespace extensions {
+
+namespace webview_api = api::web_view_internal;
+
+// A delegate class of WebViewGuest that are not a part of chrome.
+class WebViewGuestDelegate {
+ public :
+ WebViewGuestDelegate();
+ virtual ~WebViewGuestDelegate();
+
+ typedef std::vector<linked_ptr<webview_api::ContextMenuItem> > MenuItemVector;
+
+ // Returns the current zoom factor.
+ virtual double GetZoom() = 0;
+
+ // Called when context menu operation was handled.
+ virtual bool HandleContextMenu(const content::ContextMenuParams& params) = 0;
+
+ // Called to attach helpers just after additional initialization is performed.
+ virtual void OnAttachWebViewHelpers(content::WebContents* contents) = 0;
+
+ // Called when the guest WebContents commits a provisional load in any frame.
+ virtual void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) = 0;
+
+ // Called just after additional initialization is performed.
+ virtual void OnDidInitialize() = 0;
+
+ virtual void OnDocumentLoadedInFrame(
+ content::RenderFrameHost* render_frame_host) = 0;
+
+ // Called immediately after the guest WebContents has been destroyed.
+ virtual void OnGuestDestroyed() = 0;
+
+ // Called when to set the zoom factor.
+ virtual void OnSetZoom(double zoom_factor) = 0;
+
+ // Shows the context menu for the guest.
+ // |items| acts as a filter. This restricts the current context's default
+ // menu items to contain only the items from |items|.
+ // |items| == NULL means no filtering will be applied.
+ virtual void OnShowContextMenu(
+ int request_id,
+ const MenuItemVector* items) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(WebViewGuestDelegate);
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_GUEST_DELEGATE_H_
diff --git a/extensions/extensions.gyp b/extensions/extensions.gyp
index ed6757d..83d8fe1 100644
--- a/extensions/extensions.gyp
+++ b/extensions/extensions.gyp
@@ -470,6 +470,8 @@
'browser/guest_view/guest_view.h',
'browser/guest_view/web_view/web_view_permission_helper_delegate.cc',
'browser/guest_view/web_view/web_view_permission_helper_delegate.h',
+ 'browser/guest_view/web_view/web_view_guest_delegate.cc',
+ 'browser/guest_view/web_view/web_view_guest_delegate.h',
'browser/image_loader.cc',
'browser/image_loader.h',
'browser/image_loader_factory.cc',