summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-19 21:01:18 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-19 21:01:18 +0000
commit1fd456988642f12f398b05b1bcf05d59ecd86c56 (patch)
tree94f717ec613cd0d819f1f03052a7e0740c21b234
parent24c0cd67a1b25a26da7e45117990098988c47368 (diff)
downloadchromium_src-1fd456988642f12f398b05b1bcf05d59ecd86c56.zip
chromium_src-1fd456988642f12f398b05b1bcf05d59ecd86c56.tar.gz
chromium_src-1fd456988642f12f398b05b1bcf05d59ecd86c56.tar.bz2
Context menu operations like Cut/Copy/Paste etc would not work in pages rendered by ChromeFrame. The context menu is displayed
by the ChromeFrame plugin which grabs focus to ensure that the menu has focus, and then restores focus back once we select an item. The latter step sends over a notification to Chrome via an automation message which then informs the view. This resets the webview item selection which results in this bug. Fix is to send over an additional flag to Chrome in the SetInitialFocus which indicates whether we need to inform the view about the focus change or not. Fixes bug http://code.google.com/p/chromium/issues/detail?id=41523 Bug=41523 Review URL: http://codereview.chromium.org/1574033 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44951 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/automation/automation_provider.h3
-rw-r--r--chrome/browser/automation/automation_provider_gtk.cc3
-rw-r--r--chrome/browser/automation/automation_provider_mac.mm3
-rw-r--r--chrome/browser/automation/automation_provider_win.cc5
-rw-r--r--chrome/browser/external_tab_container.cc5
-rw-r--r--chrome/browser/external_tab_container.h2
-rw-r--r--chrome/test/automation/automation_messages_internal.h5
-rw-r--r--chrome/test/automation/tab_proxy.cc5
-rw-r--r--chrome/test/automation/tab_proxy.h5
-rw-r--r--chrome_frame/chrome_active_document.cc2
-rw-r--r--chrome_frame/chrome_frame_plugin.h9
11 files changed, 30 insertions, 17 deletions
diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h
index 0c30ced..6329a3a 100644
--- a/chrome/browser/automation/automation_provider.h
+++ b/chrome/browser/automation/automation_provider.h
@@ -439,7 +439,8 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>,
const MSG& msg);
#endif
- void SetInitialFocus(const IPC::Message& message, int handle, bool reverse);
+ void SetInitialFocus(const IPC::Message& message, int handle, bool reverse,
+ bool restore_focus_to_view);
// See comment in AutomationMsg_WaitForTabToBeRestored.
void WaitForTabToBeRestored(int tab_handle, IPC::Message* reply_message);
diff --git a/chrome/browser/automation/automation_provider_gtk.cc b/chrome/browser/automation/automation_provider_gtk.cc
index 62b378f..a0fe498 100644
--- a/chrome/browser/automation/automation_provider_gtk.cc
+++ b/chrome/browser/automation/automation_provider_gtk.cc
@@ -84,7 +84,8 @@ void AutomationProvider::PrintAsync(int tab_handle) {
}
void AutomationProvider::SetInitialFocus(const IPC::Message& message,
- int handle, bool reverse) {
+ int handle, bool reverse,
+ bool restore_focus_to_view) {
NOTIMPLEMENTED();
}
diff --git a/chrome/browser/automation/automation_provider_mac.mm b/chrome/browser/automation/automation_provider_mac.mm
index 9f2ed97..ff92977 100644
--- a/chrome/browser/automation/automation_provider_mac.mm
+++ b/chrome/browser/automation/automation_provider_mac.mm
@@ -78,7 +78,8 @@ void AutomationProvider::OnMessageFromExternalHost(int handle,
}
void AutomationProvider::SetInitialFocus(const IPC::Message& message,
- int handle, bool reverse) {
+ int handle, bool reverse,
+ bool restore_focus_to_view) {
NOTIMPLEMENTED();
}
diff --git a/chrome/browser/automation/automation_provider_win.cc b/chrome/browser/automation/automation_provider_win.cc
index d86e0b5..2be9574 100644
--- a/chrome/browser/automation/automation_provider_win.cc
+++ b/chrome/browser/automation/automation_provider_win.cc
@@ -347,10 +347,11 @@ void AutomationProvider::ProcessUnhandledAccelerator(
}
void AutomationProvider::SetInitialFocus(const IPC::Message& message,
- int handle, bool reverse) {
+ int handle, bool reverse,
+ bool restore_focus_to_view) {
ExternalTabContainer* external_tab = GetExternalTabForHandle(handle);
if (external_tab) {
- external_tab->FocusThroughTabTraversal(reverse);
+ external_tab->FocusThroughTabTraversal(reverse, restore_focus_to_view);
}
// This message expects no response.
}
diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc
index 4c46493..42db662 100644
--- a/chrome/browser/external_tab_container.cc
+++ b/chrome/browser/external_tab_container.cc
@@ -237,7 +237,8 @@ void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) {
GetFocusManager());
}
-void ExternalTabContainer::FocusThroughTabTraversal(bool reverse) {
+void ExternalTabContainer::FocusThroughTabTraversal(
+ bool reverse, bool restore_focus_to_view) {
DCHECK(tab_contents_);
if (tab_contents_)
tab_contents_->Focus();
@@ -246,7 +247,7 @@ void ExternalTabContainer::FocusThroughTabTraversal(bool reverse) {
// TabContentsViewWin::Focus() above. This method eventually calls SetFocus
// on the native window, which could end up dispatching messages like
// WM_DESTROY for the external tab.
- if (tab_contents_)
+ if (tab_contents_ && restore_focus_to_view)
tab_contents_->FocusThroughTabTraversal(reverse);
}
diff --git a/chrome/browser/external_tab_container.h b/chrome/browser/external_tab_container.h
index dcf30ee..eca66b1 100644
--- a/chrome/browser/external_tab_container.h
+++ b/chrome/browser/external_tab_container.h
@@ -86,7 +86,7 @@ class ExternalTabContainer : public TabContentsDelegate,
void ProcessUnhandledAccelerator(const MSG& msg);
// See TabContents::FocusThroughTabTraversal. Called from AutomationProvider.
- void FocusThroughTabTraversal(bool reverse);
+ void FocusThroughTabTraversal(bool reverse, bool restore_focus_to_view);
// A helper method that tests whether the given window is an
// ExternalTabContainer window
diff --git a/chrome/test/automation/automation_messages_internal.h b/chrome/test/automation/automation_messages_internal.h
index 8430172..d938b9f 100644
--- a/chrome/test/automation/automation_messages_internal.h
+++ b/chrome/test/automation/automation_messages_internal.h
@@ -551,9 +551,12 @@ IPC_BEGIN_MESSAGES(Automation)
// - bool: |reverse|
// true: Focus will be set to the last focusable element
// false: Focus will be set to the first focusable element
+ // - bool: |restore_focus_to_view|
+ // true: The renderer view associated with the current tab will be
+ // infomed that it is receiving focus.
// Response:
// None expected
- IPC_MESSAGE_ROUTED2(AutomationMsg_SetInitialFocus, int, bool)
+ IPC_MESSAGE_ROUTED3(AutomationMsg_SetInitialFocus, int, bool, bool)
// This message is an outgoing message from Chrome to an external host.
// It is a request to open a url
diff --git a/chrome/test/automation/tab_proxy.cc b/chrome/test/automation/tab_proxy.cc
index ed4db9e..495cf7a 100644
--- a/chrome/test/automation/tab_proxy.cc
+++ b/chrome/test/automation/tab_proxy.cc
@@ -522,11 +522,12 @@ bool TabProxy::ProcessUnhandledAccelerator(const MSG& msg) {
}
#endif // defined(OS_WIN)
-bool TabProxy::SetInitialFocus(bool reverse) {
+bool TabProxy::SetInitialFocus(bool reverse, bool restore_focus_to_view) {
if (!is_valid())
return false;
return sender_->Send(
- new AutomationMsg_SetInitialFocus(0, handle_, reverse));
+ new AutomationMsg_SetInitialFocus(0, handle_, reverse,
+ restore_focus_to_view));
// This message expects no response
}
diff --git a/chrome/test/automation/tab_proxy.h b/chrome/test/automation/tab_proxy.h
index 8115871..ad28090 100644
--- a/chrome/test/automation/tab_proxy.h
+++ b/chrome/test/automation/tab_proxy.h
@@ -286,7 +286,10 @@ class TabProxy : public AutomationResourceProxy,
#endif // defined(OS_WIN)
// Ask the tab to set focus to either the first or last element on the page.
- bool SetInitialFocus(bool reverse) WARN_UNUSED_RESULT;
+ // When the restore_focus_to_view parameter is true, the render view
+ // associated with the current tab is informed that it is receiving focus.
+ bool SetInitialFocus(bool reverse, bool restore_focus_to_view)
+ WARN_UNUSED_RESULT;
// Waits for the tab to finish being restored. Returns true on success.
// timeout_ms gives the max amount of time to wait for restore to complete.
diff --git a/chrome_frame/chrome_active_document.cc b/chrome_frame/chrome_active_document.cc
index 26bfa4f..d31b2a8 100644
--- a/chrome_frame/chrome_active_document.cc
+++ b/chrome_frame/chrome_active_document.cc
@@ -194,7 +194,7 @@ STDMETHODIMP ChromeActiveDocument::IsDirty() {
void ChromeActiveDocument::OnAutomationServerReady() {
BaseActiveX::OnAutomationServerReady();
- BaseActiveX::GiveFocusToChrome();
+ BaseActiveX::GiveFocusToChrome(true);
}
STDMETHODIMP ChromeActiveDocument::Load(BOOL fully_avalable,
diff --git a/chrome_frame/chrome_frame_plugin.h b/chrome_frame/chrome_frame_plugin.h
index c7b0598..85d83dc 100644
--- a/chrome_frame/chrome_frame_plugin.h
+++ b/chrome_frame/chrome_frame_plugin.h
@@ -142,7 +142,7 @@ END_MSG_MAP()
UINT selected = TrackPopupMenuEx(copy, flags, params.screen_x,
params.screen_y, GetWindow(), NULL);
// Menu is over now give focus back to chrome
- GiveFocusToChrome();
+ GiveFocusToChrome(false);
if (IsValid() && selected != 0 &&
!self->HandleContextMenuCommand(selected, params)) {
automation_client_->SendContextMenuCommandToChromeFrame(selected);
@@ -155,7 +155,7 @@ END_MSG_MAP()
LRESULT OnSetFocus(UINT message, WPARAM wparam, LPARAM lparam,
BOOL& handled) { // NO_LINT
if (!ignore_setfocus_ && IsValid()) {
- GiveFocusToChrome();
+ GiveFocusToChrome(true);
}
return 0;
}
@@ -215,13 +215,14 @@ END_MSG_MAP()
return new ChromeFrameAutomationClient;
}
- void GiveFocusToChrome() {
+ void GiveFocusToChrome(bool restore_focus_to_view) {
if (IsValid()) {
TabProxy* tab = automation_client_->tab();
HWND chrome_window = automation_client_->tab_window();
if (tab && ::IsWindow(chrome_window)) {
DLOG(INFO) << "Setting initial focus";
- tab->SetInitialFocus(win_util::IsShiftPressed());
+ tab->SetInitialFocus(win_util::IsShiftPressed(),
+ restore_focus_to_view);
}
}
}