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

Unified Diff: webkit/glue/webview_impl.cc

Issue 151195: Simplifying renderer focus management (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 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 | « webkit/glue/webview_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webview_impl.cc
===================================================================
--- webkit/glue/webview_impl.cc (revision 19803)
+++ webkit/glue/webview_impl.cc (working copy)
@@ -380,7 +380,6 @@
WebViewImpl::~WebViewImpl() {
DCHECK(page_ == NULL);
- ReleaseFocusReferences();
for (std::set<ImageResourceFetcher*>::iterator i = image_fetchers_.begin();
i != image_fetchers_.end(); ++i) {
delete *i;
@@ -1098,10 +1097,10 @@
}
void WebViewImpl::ClearFocusedNode() {
- // Get the last focused frame or the mainframe.
- RefPtr<Frame> frame = last_focused_frame_;
- if (!frame.get() && page_.get())
- frame = page_->mainFrame();
+ if (!page_.get())
+ return;
+
+ RefPtr<Frame> frame = page_->mainFrame();
if (!frame.get())
return;
@@ -1131,29 +1130,15 @@
}
void WebViewImpl::SetFocus(bool enable) {
+ page_->focusController()->setFocused(enable);
if (enable) {
- // Getting the focused frame will have the side-effect of setting the main
- // frame as the focused frame if it is not already focused. Otherwise, if
- // there is already a focused frame, then this does nothing.
- GetFocusedFrame();
- if (page_.get() && page_->mainFrame()) {
- Frame* frame = page_->mainFrame();
- if (!frame->selection()->isFocusedAndActive()) {
- // No one has focus yet, try to restore focus.
- RestoreFocus();
- page_->focusController()->setActive(true);
- }
- Frame* focused_frame = page_->focusController()->focusedOrMainFrame();
- frame->selection()->setFocused(frame == focused_frame);
- }
+ // Note that we don't call setActive() when disabled as this cause extra
+ // focus/blur events to be dispatched.
+ page_->focusController()->setActive(true);
ime_accept_events_ = true;
} else {
HideAutoCompletePopup();
- // Clear out who last had focus. If someone has focus, the refs will be
- // updated below.
- ReleaseFocusReferences();
-
// Clear focus on the currently focused frame if any.
if (!page_.get())
return;
@@ -1162,64 +1147,17 @@
if (!frame)
return;
- RefPtr<Frame> focused = page_->focusController()->focusedFrame();
- if (focused.get()) {
- // Update the focus refs, this way we can give focus back appropriately.
- // It's entirely possible to have a focused document, but not a focused
- // node.
- RefPtr<Document> document = focused->document();
- last_focused_frame_ = focused;
- if (document.get()) {
- RefPtr<Node> focused_node = document->focusedNode();
- if (focused_node.get()) {
- // To workaround bug #792423, we do not blur the focused node. This
- // should be reenabled when we merge a WebKit that has the fix for
- // http://bugs.webkit.org/show_bug.cgi?id=16928.
- // last_focused_node_ = focused_node;
- // document->setFocusedNode(NULL);
- }
- }
- page_->focusController()->setFocusedFrame(0);
-
+ RefPtr<Frame> focused_frame = page_->focusController()->focusedFrame();
+ if (focused_frame.get()) {
// Finish an ongoing composition to delete the composition node.
- Editor* editor = focused->editor();
+ Editor* editor = focused_frame->editor();
if (editor && editor->hasComposition())
editor->confirmComposition();
ime_accept_events_ = false;
}
- // Make sure the main frame doesn't think it has focus.
- if (frame != focused.get())
- frame->selection()->setFocused(false);
}
}
-// TODO(jcampan): http://b/issue?id=1157486 this is needed to work-around
-// issues caused by the fix for bug #792423 and should be removed when that
-// bug is fixed.
-void WebViewImpl::StoreFocusForFrame(WebFrame* frame) {
- DCHECK(frame);
-
- // We only want to store focus info if we are the focused frame and if we have
- // not stored it already.
- WebCore::Frame* webcore_frame = static_cast<WebFrameImpl*>(frame)->frame();
- if (last_focused_frame_.get() != webcore_frame || last_focused_node_.get())
- return;
-
- // Clear out who last had focus. If someone has focus, the refs will be
- // updated below.
- ReleaseFocusReferences();
-
- last_focused_frame_ = webcore_frame;
- RefPtr<Document> document = last_focused_frame_->document();
- if (document.get()) {
- RefPtr<Node> focused_node = document->focusedNode();
- if (focused_node.get()) {
- last_focused_node_ = focused_node;
- document->setFocusedNode(NULL);
- }
- }
-}
-
bool WebViewImpl::ImeSetComposition(int string_type,
int cursor_position,
int target_start,
@@ -1370,29 +1308,8 @@
}
}
-void WebViewImpl::RestoreFocus() {
- if (last_focused_frame_.get()) {
- if (last_focused_frame_->page()) {
- // last_focused_frame_ can be detached from the frame tree, thus,
- // its page can be null.
- last_focused_frame_->page()->focusController()->setFocusedFrame(
- last_focused_frame_.get());
- }
- if (last_focused_node_.get()) {
- // last_focused_node_ may be null, make sure it's valid before trying to
- // focus it.
- static_cast<Element*>(last_focused_node_.get())->focus();
- }
- // And clear out the refs.
- ReleaseFocusReferences();
- }
-}
-
void WebViewImpl::SetInitialFocus(bool reverse) {
if (page_.get()) {
- // So RestoreFocus does not focus anything when it is called.
- ReleaseFocusReferences();
-
// Since we don't have a keyboard event, we'll create one.
WebKeyboardEvent keyboard_event;
keyboard_event.type = WebInputEvent::RawKeyDown;
@@ -1410,14 +1327,6 @@
}
}
-// Releases references used to restore focus.
-void WebViewImpl::ReleaseFocusReferences() {
- if (last_focused_frame_.get()) {
- last_focused_frame_.release();
- last_focused_node_.release();
- }
-}
-
bool WebViewImpl::DownloadImage(int id, const GURL& image_url, int image_size) {
if (!page_.get())
return false;
« no previous file with comments | « webkit/glue/webview_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698