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

Side by Side Diff: webkit/glue/webframe_impl.cc

Issue 13130: Fix issue 5079: Incorrect "Active match ordinal" count during Find-in-page... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 // We can't load a javascript: URL if there is no Document! 346 // We can't load a javascript: URL if there is no Document!
347 if (!frame_->document()) 347 if (!frame_->document())
348 return; 348 return;
349 349
350 // TODO(darin): Is this the best API to use here? It works and seems good, 350 // TODO(darin): Is this the best API to use here? It works and seems good,
351 // but will it change out from under us? 351 // but will it change out from under us?
352 String script = 352 String script =
353 decodeURLEscapeSequences(kurl.string().substring(sizeof("javascript:")-1 )); 353 decodeURLEscapeSequences(kurl.string().substring(sizeof("javascript:")-1 ));
354 WebCore::ScriptValue result = frame_->loader()->executeScript(script, true); 354 WebCore::ScriptValue result = frame_->loader()->executeScript(script, true);
355 String scriptResult; 355 String scriptResult;
356 if (result.getString(scriptResult) && 356 if (result.getString(scriptResult) &&
357 !frame_->loader()->isScheduledLocationChangePending()) { 357 !frame_->loader()->isScheduledLocationChangePending()) {
358 // TODO(darin): We need to figure out how to represent this in session 358 // TODO(darin): We need to figure out how to represent this in session
359 // history. Hint: don't re-eval script when the user or script navigates 359 // history. Hint: don't re-eval script when the user or script navigates
360 // back-n-forth (instead store the script result somewhere). 360 // back-n-forth (instead store the script result somewhere).
361 LoadDocumentData(kurl, scriptResult, String("text/html"), String()); 361 LoadDocumentData(kurl, scriptResult, String("text/html"), String());
362 } 362 }
363 return; 363 return;
364 } 364 }
365 365
366 StopLoading(); // make sure existing activity stops 366 StopLoading(); // make sure existing activity stops
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 view->x() + view->visibleWidth(), view->y(), 757 view->x() + view->visibleWidth(), view->y(),
758 WebCore::ScrollbarTheme::nativeTheme()->scrollbarThickness(), 758 WebCore::ScrollbarTheme::nativeTheme()->scrollbarThickness(),
759 view->visibleHeight()); 759 view->visibleHeight());
760 view->invalidateRect(scroll_bar_vert); 760 view->invalidateRect(scroll_bar_vert);
761 } 761 }
762 } 762 }
763 #endif 763 #endif
764 } 764 }
765 765
766 void WebFrameImpl::IncreaseMatchCount(int count, int request_id) { 766 void WebFrameImpl::IncreaseMatchCount(int count, int request_id) {
767 // This function should only be called on the mainframe.
768 DCHECK(this == static_cast<WebFrameImpl*>(GetView()->GetMainFrame()));
769
767 total_matchcount_ += count; 770 total_matchcount_ += count;
768 771
769 // Update the UI with the latest findings. 772 // Update the UI with the latest findings.
770 WebViewDelegate* webview_delegate = GetView()->GetDelegate(); 773 WebViewDelegate* webview_delegate = GetView()->GetDelegate();
771 DCHECK(webview_delegate); 774 DCHECK(webview_delegate);
772 if (webview_delegate) 775 if (webview_delegate)
773 webview_delegate->ReportFindInPageMatchCount(total_matchcount_, request_id, 776 webview_delegate->ReportFindInPageMatchCount(total_matchcount_, request_id,
774 frames_scoping_count_ == 0); 777 frames_scoping_count_ == 0);
775 } 778 }
776 779
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 bool start_in_selection = true; 812 bool start_in_selection = true;
810 813
811 DCHECK(frame() && frame()->view()); 814 DCHECK(frame() && frame()->view());
812 bool found = frame()->findString(webcore_string, request.forward, 815 bool found = frame()->findString(webcore_string, request.forward,
813 request.match_case, wrap_within_frame, 816 request.match_case, wrap_within_frame,
814 start_in_selection); 817 start_in_selection);
815 if (found) { 818 if (found) {
816 #if defined(OS_WIN) 819 #if defined(OS_WIN)
817 WebCore::RenderThemeWin::setFindInPageMode(true); 820 WebCore::RenderThemeWin::setFindInPageMode(true);
818 #endif 821 #endif
822 // Store which frame was active. This will come in handy later when we
823 // change the active match ordinal below.
824 WebFrameImpl* old_active_frame = main_frame_impl->active_match_frame_;
819 // Set this frame as the active frame (the one with the active highlight). 825 // Set this frame as the active frame (the one with the active highlight).
820 main_frame_impl->active_match_frame_ = this; 826 main_frame_impl->active_match_frame_ = this;
821 827
822 // We found something, so we can now query the selection for its position. 828 // We found something, so we can now query the selection for its position.
823 Selection new_selection(frame()->selection()->selection()); 829 Selection new_selection(frame()->selection()->selection());
824 IntRect curr_selection_rect; 830 IntRect curr_selection_rect;
825 831
826 // If we thought we found something, but it couldn't be selected (perhaps 832 // If we thought we found something, but it couldn't be selected (perhaps
827 // because it was marked -webkit-user-select: none), we can't set it to 833 // because it was marked -webkit-user-select: none), we can't set it to
828 // be active but we still continue searching. This matches Safari's 834 // be active but we still continue searching. This matches Safari's
829 // behavior, including some oddities when selectable and un-selectable text 835 // behavior, including some oddities when selectable and un-selectable text
830 // are mixed on a page: see https://bugs.webkit.org/show_bug.cgi?id=19127. 836 // are mixed on a page: see https://bugs.webkit.org/show_bug.cgi?id=19127.
831 if (new_selection.isNone() || 837 if (new_selection.isNone() ||
832 (new_selection.start() == new_selection.end())) { 838 (new_selection.start() == new_selection.end())) {
833 active_match_ = NULL; 839 active_match_ = NULL;
834 } else { 840 } else {
835 active_match_ = new_selection.toRange(); 841 active_match_ = new_selection.toRange();
836 curr_selection_rect = active_match_->boundingBox(); 842 curr_selection_rect = active_match_->boundingBox();
837 } 843 }
838 844
839 if (!request.find_next) { 845 if (!request.find_next) {
840 // This is a Find operation, so we set the flag to ask the scoping effort 846 // This is a Find operation, so we set the flag to ask the scoping effort
841 // to find the active rect for us so we can update the ordinal (n of m). 847 // to find the active rect for us so we can update the ordinal (n of m).
842 locating_active_rect_ = true; 848 locating_active_rect_ = true;
843 } else { 849 } else {
844 // This is FindNext so we need to increment (or decrement) the count and 850 if (old_active_frame != this) {
845 // wrap if needed. 851 // If the active frame has changed it means that we have a multi-frame
846 request.forward ? ++active_match_index_ : --active_match_index_; 852 // page and we just switch to searching in a new frame. Then we just
847 if (active_match_index_ + 1 > last_match_count_) 853 // want to reset the index.
848 active_match_index_ = 0; 854 if (request.forward)
849 if (active_match_index_ + 1 == 0) 855 active_match_index_ = 0;
850 active_match_index_ = last_match_count_ - 1; 856 else
857 active_match_index_ = last_match_count_ - 1;
858 } else {
859 // We are still the active frame, so increment (or decrement) the
860 // |active_match_index|, wrapping if needed (on single frame pages).
861 request.forward ? ++active_match_index_ : --active_match_index_;
862 if (active_match_index_ + 1 > last_match_count_)
863 active_match_index_ = 0;
864 if (active_match_index_ + 1 == 0)
865 active_match_index_ = last_match_count_ - 1;
866 }
851 } 867 }
852 868
853 #if defined(OS_WIN) 869 #if defined(OS_WIN)
854 // TODO(pinkerton): Fix Mac scrolling to be more like Win ScrollView 870 // TODO(pinkerton): Fix Mac scrolling to be more like Win ScrollView
855 if (selection_rect) { 871 if (selection_rect) {
856 gfx::Rect rect = webkit_glue::FromIntRect( 872 gfx::Rect rect = webkit_glue::FromIntRect(
857 frame()->view()->convertToContainingWindow(curr_selection_rect)); 873 frame()->view()->convertToContainingWindow(curr_selection_rect));
858 rect.Offset(-frameview()->scrollOffset().width(), 874 rect.Offset(-frameview()->scrollOffset().width(),
859 -frameview()->scrollOffset().height()); 875 -frameview()->scrollOffset().height());
860 *selection_rect = rect; 876 *selection_rect = rect;
(...skipping 17 matching lines...) Expand all
878 int WebFrameImpl::OrdinalOfFirstMatchForFrame(WebFrameImpl* frame) const { 894 int WebFrameImpl::OrdinalOfFirstMatchForFrame(WebFrameImpl* frame) const {
879 int ordinal = 0; 895 int ordinal = 0;
880 WebFrameImpl* const main_frame_impl = 896 WebFrameImpl* const main_frame_impl =
881 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); 897 static_cast<WebFrameImpl*>(GetView()->GetMainFrame());
882 // Iterate from the main frame up to (but not including) |frame| and 898 // Iterate from the main frame up to (but not including) |frame| and
883 // add up the number of matches found so far. 899 // add up the number of matches found so far.
884 for (WebFrameImpl* it = main_frame_impl; 900 for (WebFrameImpl* it = main_frame_impl;
885 it != frame; 901 it != frame;
886 it = static_cast<WebFrameImpl*>( 902 it = static_cast<WebFrameImpl*>(
887 webview_impl_->GetNextFrameAfter(it, true))) { 903 webview_impl_->GetNextFrameAfter(it, true))) {
888 ordinal += it->last_match_count_; 904 if (it->last_match_count_ > 0)
905 ordinal += it->last_match_count_;
889 } 906 }
890 907
891 return ordinal; 908 return ordinal;
892 } 909 }
893 910
894 bool WebFrameImpl::ShouldScopeMatches(FindInPageRequest request) { 911 bool WebFrameImpl::ShouldScopeMatches(FindInPageRequest request) {
895 // Don't scope if we can't find a frame or if the frame is not visible. 912 // Don't scope if we can't find a frame or if the frame is not visible.
896 // The user may have closed the tab/application, so abort. 913 // The user may have closed the tab/application, so abort.
897 if (!frame() || !Visible()) 914 if (!frame() || !Visible())
898 return false; 915 return false;
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 WebErrorImpl weberror_impl(error); 1549 WebErrorImpl weberror_impl(error);
1533 alt_error_page_fetcher_.reset( 1550 alt_error_page_fetcher_.reset(
1534 new AltErrorPageResourceFetcher(webview_impl_, weberror_impl, this, 1551 new AltErrorPageResourceFetcher(webview_impl_, weberror_impl, this,
1535 error_page_url)); 1552 error_page_url));
1536 } 1553 }
1537 1554
1538 void WebFrameImpl::ExecuteJavaScript(const std::string& js_code, 1555 void WebFrameImpl::ExecuteJavaScript(const std::string& js_code,
1539 const GURL& script_url) { 1556 const GURL& script_url) {
1540 WebCore::ScriptSourceCode source_code( 1557 WebCore::ScriptSourceCode source_code(
1541 webkit_glue::StdStringToString(js_code), 1558 webkit_glue::StdStringToString(js_code),
1542 webkit_glue::GURLToKURL(script_url), 1559 webkit_glue::GURLToKURL(script_url),
1543 1); // base line number (for errors) 1560 1); // base line number (for errors)
1544 frame_->loader()->executeScript(source_code); 1561 frame_->loader()->executeScript(source_code);
1545 } 1562 }
1546 1563
1547 std::wstring WebFrameImpl::GetName() { 1564 std::wstring WebFrameImpl::GetName() {
1548 return webkit_glue::StringToStdWString(frame_->tree()->name()); 1565 return webkit_glue::StringToStdWString(frame_->tree()->name());
1549 } 1566 }
1550 1567
1551 WebTextInput* WebFrameImpl::GetTextInput() { 1568 WebTextInput* WebFrameImpl::GetTextInput() {
1552 if (!webtextinput_impl_.get()) { 1569 if (!webtextinput_impl_.get()) {
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1821 return password_listeners_.get(input_element); 1838 return password_listeners_.get(input_element);
1822 } 1839 }
1823 1840
1824 void WebFrameImpl::ClearPasswordListeners() { 1841 void WebFrameImpl::ClearPasswordListeners() {
1825 for (PasswordListenerMap::iterator iter = password_listeners_.begin(); 1842 for (PasswordListenerMap::iterator iter = password_listeners_.begin();
1826 iter != password_listeners_.end(); ++iter) { 1843 iter != password_listeners_.end(); ++iter) {
1827 delete iter->second; 1844 delete iter->second;
1828 } 1845 }
1829 password_listeners_.clear(); 1846 password_listeners_.clear();
1830 } 1847 }
1831
OLDNEW
« chrome/test/automation/tab_proxy.h ('K') | « webkit/glue/webframe_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698