diff options
author | hanxi@chromium.org <hanxi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-21 04:45:43 +0000 |
---|---|---|
committer | hanxi@chromium.org <hanxi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-21 04:47:00 +0000 |
commit | cd010dbc1edf8ce6cae0e40896a1492ce1c0158c (patch) | |
tree | 0127034ed285e50937c6bb20429adb23b85a7dba | |
parent | 27e20293ff3f36a254cee1449866e4c4c87e6911 (diff) | |
download | chromium_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.cc | 204 | ||||
-rw-r--r-- | chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h | 85 | ||||
-rw-r--r-- | chrome/browser/guest_view/web_view/web_view_guest.cc | 187 | ||||
-rw-r--r-- | chrome/browser/guest_view/web_view/web_view_guest.h | 52 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | extensions/browser/guest_view/DEPS | 3 | ||||
-rw-r--r-- | extensions/browser/guest_view/web_view/web_view_guest_delegate.cc | 15 | ||||
-rw-r--r-- | extensions/browser/guest_view/web_view/web_view_guest_delegate.h | 66 | ||||
-rw-r--r-- | extensions/extensions.gyp | 2 |
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', |