OLD | NEW |
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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 #include "base/basictypes.h" | 129 #include "base/basictypes.h" |
130 #include "base/gfx/rect.h" | 130 #include "base/gfx/rect.h" |
131 #include "base/logging.h" | 131 #include "base/logging.h" |
132 #include "base/message_loop.h" | 132 #include "base/message_loop.h" |
133 #include "base/stats_counters.h" | 133 #include "base/stats_counters.h" |
134 #include "base/string_util.h" | 134 #include "base/string_util.h" |
135 #include "net/base/net_errors.h" | 135 #include "net/base/net_errors.h" |
136 #include "skia/ext/bitmap_platform_device.h" | 136 #include "skia/ext/bitmap_platform_device.h" |
137 #include "skia/ext/platform_canvas.h" | 137 #include "skia/ext/platform_canvas.h" |
138 #include "third_party/WebKit/WebKit/chromium/public/WebConsoleMessage.h" | 138 #include "third_party/WebKit/WebKit/chromium/public/WebConsoleMessage.h" |
139 #include "third_party/WebKit/WebKit/chromium/public/WebFindInPageRequest.h" | 139 #include "third_party/WebKit/WebKit/chromium/public/WebFindOptions.h" |
140 #include "third_party/WebKit/WebKit/chromium/public/WebScriptSource.h" | 140 #include "third_party/WebKit/WebKit/chromium/public/WebScriptSource.h" |
141 #include "webkit/glue/alt_error_page_resource_fetcher.h" | 141 #include "webkit/glue/alt_error_page_resource_fetcher.h" |
142 #include "webkit/glue/dom_operations.h" | 142 #include "webkit/glue/dom_operations.h" |
143 #include "webkit/glue/dom_operations_private.h" | 143 #include "webkit/glue/dom_operations_private.h" |
144 #include "webkit/glue/feed.h" | 144 #include "webkit/glue/feed.h" |
145 #include "webkit/glue/glue_serialize.h" | 145 #include "webkit/glue/glue_serialize.h" |
146 #include "webkit/glue/glue_util.h" | 146 #include "webkit/glue/glue_util.h" |
147 #include "webkit/glue/webdatasource_impl.h" | 147 #include "webkit/glue/webdatasource_impl.h" |
148 #include "webkit/glue/weberror_impl.h" | 148 #include "webkit/glue/weberror_impl.h" |
149 #include "webkit/glue/webframe_impl.h" | 149 #include "webkit/glue/webframe_impl.h" |
150 #include "webkit/glue/webhistoryitem_impl.h" | 150 #include "webkit/glue/webhistoryitem_impl.h" |
151 #include "webkit/glue/weburlrequest_impl.h" | 151 #include "webkit/glue/weburlrequest_impl.h" |
152 #include "webkit/glue/webtextinput_impl.h" | 152 #include "webkit/glue/webtextinput_impl.h" |
153 #include "webkit/glue/webview_impl.h" | 153 #include "webkit/glue/webview_impl.h" |
154 | 154 |
155 #if defined(OS_LINUX) | 155 #if defined(OS_LINUX) |
156 #include <gdk/gdk.h> | 156 #include <gdk/gdk.h> |
157 #endif | 157 #endif |
158 | 158 |
159 #if USE(JSC) | 159 #if USE(JSC) |
160 #include "bridge/c/c_instance.h" | 160 #include "bridge/c/c_instance.h" |
161 #include "bridge/runtime_object.h" | 161 #include "bridge/runtime_object.h" |
162 #endif | 162 #endif |
163 | 163 |
164 using base::Time; | 164 using base::Time; |
| 165 |
165 using WebCore::ChromeClientChromium; | 166 using WebCore::ChromeClientChromium; |
166 using WebCore::Color; | 167 using WebCore::Color; |
167 using WebCore::Document; | 168 using WebCore::Document; |
168 using WebCore::DocumentFragment; | 169 using WebCore::DocumentFragment; |
169 using WebCore::DocumentLoader; | 170 using WebCore::DocumentLoader; |
170 using WebCore::ExceptionCode; | 171 using WebCore::ExceptionCode; |
171 using WebCore::GraphicsContext; | 172 using WebCore::GraphicsContext; |
172 using WebCore::HTMLFrameOwnerElement; | 173 using WebCore::HTMLFrameOwnerElement; |
173 using WebCore::Frame; | 174 using WebCore::Frame; |
174 using WebCore::FrameLoader; | 175 using WebCore::FrameLoader; |
(...skipping 12 matching lines...) Expand all Loading... |
187 using WebCore::ResourceError; | 188 using WebCore::ResourceError; |
188 using WebCore::ResourceHandle; | 189 using WebCore::ResourceHandle; |
189 using WebCore::ResourceRequest; | 190 using WebCore::ResourceRequest; |
190 using WebCore::VisibleSelection; | 191 using WebCore::VisibleSelection; |
191 using WebCore::SharedBuffer; | 192 using WebCore::SharedBuffer; |
192 using WebCore::String; | 193 using WebCore::String; |
193 using WebCore::SubstituteData; | 194 using WebCore::SubstituteData; |
194 using WebCore::TextIterator; | 195 using WebCore::TextIterator; |
195 using WebCore::VisiblePosition; | 196 using WebCore::VisiblePosition; |
196 using WebCore::XPathResult; | 197 using WebCore::XPathResult; |
| 198 |
197 using WebKit::WebConsoleMessage; | 199 using WebKit::WebConsoleMessage; |
198 using WebKit::WebFindInPageRequest; | 200 using WebKit::WebFindOptions; |
199 using WebKit::WebScriptSource; | 201 using WebKit::WebScriptSource; |
200 | 202 |
201 // Key for a StatsCounter tracking how many WebFrames are active. | 203 // Key for a StatsCounter tracking how many WebFrames are active. |
202 static const char* const kWebFrameActiveCount = "WebFrameActiveCount"; | 204 static const char* const kWebFrameActiveCount = "WebFrameActiveCount"; |
203 | 205 |
204 static const char* const kOSDType = "application/opensearchdescription+xml"; | 206 static const char* const kOSDType = "application/opensearchdescription+xml"; |
205 static const char* const kOSDRel = "search"; | 207 static const char* const kOSDRel = "search"; |
206 | 208 |
207 // The separator between frames when the frames are converted to plain text. | 209 // The separator between frames when the frames are converted to plain text. |
208 static const wchar_t kFrameSeparator[] = L"\n\n"; | 210 static const wchar_t kFrameSeparator[] = L"\n\n"; |
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 OrdinalOfFirstMatchForFrame(this) + active_match_ordinal, | 942 OrdinalOfFirstMatchForFrame(this) + active_match_ordinal, |
941 selection_rect); | 943 selection_rect); |
942 } | 944 } |
943 } | 945 } |
944 | 946 |
945 void WebFrameImpl::ResetMatchCount() { | 947 void WebFrameImpl::ResetMatchCount() { |
946 total_matchcount_ = 0; | 948 total_matchcount_ = 0; |
947 frames_scoping_count_ = 0; | 949 frames_scoping_count_ = 0; |
948 } | 950 } |
949 | 951 |
950 bool WebFrameImpl::Find(const WebFindInPageRequest& request, | 952 bool WebFrameImpl::Find(int request_id, |
| 953 const string16& search_text, |
| 954 const WebFindOptions& options, |
951 bool wrap_within_frame, | 955 bool wrap_within_frame, |
952 gfx::Rect* selection_rect) { | 956 gfx::Rect* selection_rect) { |
953 WebCore::String webcore_string = | 957 WebCore::String webcore_string = webkit_glue::String16ToString(search_text); |
954 webkit_glue::WebStringToString(request.text); | |
955 | 958 |
956 WebFrameImpl* const main_frame_impl = | 959 WebFrameImpl* const main_frame_impl = |
957 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); | 960 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); |
958 | 961 |
959 if (!request.findNext) | 962 if (!options.findNext) |
960 frame()->page()->unmarkAllTextMatches(); | 963 frame()->page()->unmarkAllTextMatches(); |
961 | 964 |
962 // Starts the search from the current selection. | 965 // Starts the search from the current selection. |
963 bool start_in_selection = true; | 966 bool start_in_selection = true; |
964 | 967 |
965 DCHECK(frame() && frame()->view()); | 968 DCHECK(frame() && frame()->view()); |
966 bool found = frame()->findString(webcore_string, request.forward, | 969 bool found = frame()->findString(webcore_string, options.forward, |
967 request.matchCase, wrap_within_frame, | 970 options.matchCase, wrap_within_frame, |
968 start_in_selection); | 971 start_in_selection); |
969 if (found) { | 972 if (found) { |
970 #if defined(OS_WIN) | 973 #if defined(OS_WIN) |
971 WebCore::RenderThemeChromiumWin::setFindInPageMode(true); | 974 WebCore::RenderThemeChromiumWin::setFindInPageMode(true); |
972 #endif | 975 #endif |
973 // Store which frame was active. This will come in handy later when we | 976 // Store which frame was active. This will come in handy later when we |
974 // change the active match ordinal below. | 977 // change the active match ordinal below. |
975 WebFrameImpl* old_active_frame = main_frame_impl->active_match_frame_; | 978 WebFrameImpl* old_active_frame = main_frame_impl->active_match_frame_; |
976 // Set this frame as the active frame (the one with the active highlight). | 979 // Set this frame as the active frame (the one with the active highlight). |
977 main_frame_impl->active_match_frame_ = this; | 980 main_frame_impl->active_match_frame_ = this; |
978 | 981 |
979 // We found something, so we can now query the selection for its position. | 982 // We found something, so we can now query the selection for its position. |
980 VisibleSelection new_selection(frame()->selection()->selection()); | 983 VisibleSelection new_selection(frame()->selection()->selection()); |
981 IntRect curr_selection_rect; | 984 IntRect curr_selection_rect; |
982 | 985 |
983 // If we thought we found something, but it couldn't be selected (perhaps | 986 // If we thought we found something, but it couldn't be selected (perhaps |
984 // because it was marked -webkit-user-select: none), we can't set it to | 987 // because it was marked -webkit-user-select: none), we can't set it to |
985 // be active but we still continue searching. This matches Safari's | 988 // be active but we still continue searching. This matches Safari's |
986 // behavior, including some oddities when selectable and un-selectable text | 989 // behavior, including some oddities when selectable and un-selectable text |
987 // are mixed on a page: see https://bugs.webkit.org/show_bug.cgi?id=19127. | 990 // are mixed on a page: see https://bugs.webkit.org/show_bug.cgi?id=19127. |
988 if (new_selection.isNone() || | 991 if (new_selection.isNone() || |
989 (new_selection.start() == new_selection.end())) { | 992 (new_selection.start() == new_selection.end())) { |
990 active_match_ = NULL; | 993 active_match_ = NULL; |
991 } else { | 994 } else { |
992 active_match_ = new_selection.toNormalizedRange(); | 995 active_match_ = new_selection.toNormalizedRange(); |
993 curr_selection_rect = active_match_->boundingBox(); | 996 curr_selection_rect = active_match_->boundingBox(); |
994 } | 997 } |
995 | 998 |
996 if (!request.findNext) { | 999 if (!options.findNext) { |
997 // This is a Find operation, so we set the flag to ask the scoping effort | 1000 // This is a Find operation, so we set the flag to ask the scoping effort |
998 // to find the active rect for us so we can update the ordinal (n of m). | 1001 // to find the active rect for us so we can update the ordinal (n of m). |
999 locating_active_rect_ = true; | 1002 locating_active_rect_ = true; |
1000 } else { | 1003 } else { |
1001 if (old_active_frame != this) { | 1004 if (old_active_frame != this) { |
1002 // If the active frame has changed it means that we have a multi-frame | 1005 // If the active frame has changed it means that we have a multi-frame |
1003 // page and we just switch to searching in a new frame. Then we just | 1006 // page and we just switch to searching in a new frame. Then we just |
1004 // want to reset the index. | 1007 // want to reset the index. |
1005 if (request.forward) | 1008 if (options.forward) |
1006 active_match_index_ = 0; | 1009 active_match_index_ = 0; |
1007 else | 1010 else |
1008 active_match_index_ = last_match_count_ - 1; | 1011 active_match_index_ = last_match_count_ - 1; |
1009 } else { | 1012 } else { |
1010 // We are still the active frame, so increment (or decrement) the | 1013 // We are still the active frame, so increment (or decrement) the |
1011 // |active_match_index|, wrapping if needed (on single frame pages). | 1014 // |active_match_index|, wrapping if needed (on single frame pages). |
1012 request.forward ? ++active_match_index_ : --active_match_index_; | 1015 options.forward ? ++active_match_index_ : --active_match_index_; |
1013 if (active_match_index_ + 1 > last_match_count_) | 1016 if (active_match_index_ + 1 > last_match_count_) |
1014 active_match_index_ = 0; | 1017 active_match_index_ = 0; |
1015 if (active_match_index_ + 1 == 0) | 1018 if (active_match_index_ + 1 == 0) |
1016 active_match_index_ = last_match_count_ - 1; | 1019 active_match_index_ = last_match_count_ - 1; |
1017 } | 1020 } |
1018 #if defined(OS_WIN) | 1021 #if defined(OS_WIN) |
1019 // TODO(pinkerton): Fix Mac scrolling to be more like Win ScrollView | 1022 // TODO(pinkerton): Fix Mac scrolling to be more like Win ScrollView |
1020 if (selection_rect) { | 1023 if (selection_rect) { |
1021 gfx::Rect rect = webkit_glue::FromIntRect( | 1024 gfx::Rect rect = webkit_glue::FromIntRect( |
1022 frame()->view()->convertToContainingWindow(curr_selection_rect)); | 1025 frame()->view()->convertToContainingWindow(curr_selection_rect)); |
1023 rect.Offset(-frameview()->scrollOffset().width(), | 1026 rect.Offset(-frameview()->scrollOffset().width(), |
1024 -frameview()->scrollOffset().height()); | 1027 -frameview()->scrollOffset().height()); |
1025 *selection_rect = rect; | 1028 *selection_rect = rect; |
1026 | 1029 |
1027 ReportFindInPageSelection(rect, | 1030 ReportFindInPageSelection(rect, |
1028 active_match_index_ + 1, | 1031 active_match_index_ + 1, |
1029 request.identifier); | 1032 request_id); |
1030 } | 1033 } |
1031 #endif | 1034 #endif |
1032 } | 1035 } |
1033 } else { | 1036 } else { |
1034 // Nothing was found in this frame. | 1037 // Nothing was found in this frame. |
1035 active_match_ = NULL; | 1038 active_match_ = NULL; |
1036 | 1039 |
1037 // Erase all previous tickmarks and highlighting. | 1040 // Erase all previous tickmarks and highlighting. |
1038 InvalidateArea(INVALIDATE_ALL); | 1041 InvalidateArea(INVALIDATE_ALL); |
1039 } | 1042 } |
(...skipping 11 matching lines...) Expand all Loading... |
1051 it != frame; | 1054 it != frame; |
1052 it = static_cast<WebFrameImpl*>( | 1055 it = static_cast<WebFrameImpl*>( |
1053 webview_impl_->GetNextFrameAfter(it, true))) { | 1056 webview_impl_->GetNextFrameAfter(it, true))) { |
1054 if (it->last_match_count_ > 0) | 1057 if (it->last_match_count_ > 0) |
1055 ordinal += it->last_match_count_; | 1058 ordinal += it->last_match_count_; |
1056 } | 1059 } |
1057 | 1060 |
1058 return ordinal; | 1061 return ordinal; |
1059 } | 1062 } |
1060 | 1063 |
1061 bool WebFrameImpl::ShouldScopeMatches(const WebFindInPageRequest& request) { | 1064 bool WebFrameImpl::ShouldScopeMatches(const string16& search_text) { |
1062 // Don't scope if we can't find a frame or if the frame is not visible. | 1065 // Don't scope if we can't find a frame or if the frame is not visible. |
1063 // The user may have closed the tab/application, so abort. | 1066 // The user may have closed the tab/application, so abort. |
1064 if (!frame() || !Visible()) | 1067 if (!frame() || !Visible()) |
1065 return false; | 1068 return false; |
1066 | 1069 |
1067 DCHECK(frame()->document() && frame()->view()); | 1070 DCHECK(frame()->document() && frame()->view()); |
1068 | 1071 |
1069 // If the frame completed the scoping operation and found 0 matches the last | 1072 // If the frame completed the scoping operation and found 0 matches the last |
1070 // time it was searched, then we don't have to search it again if the user is | 1073 // time it was searched, then we don't have to search it again if the user is |
1071 // just adding to the search string or sending the same search string again. | 1074 // just adding to the search string or sending the same search string again. |
1072 if (scoping_complete_ && | 1075 if (scoping_complete_ && |
1073 !last_search_string_.empty() && last_match_count_ == 0) { | 1076 !last_search_string_.empty() && last_match_count_ == 0) { |
1074 // Check to see if the search string prefixes match. | 1077 // Check to see if the search string prefixes match. |
1075 string16 previous_search_prefix = | 1078 string16 previous_search_prefix = |
1076 string16(request.text).substr(0, last_search_string_.length()); | 1079 search_text.substr(0, last_search_string_.length()); |
1077 | 1080 |
1078 if (previous_search_prefix == last_search_string_) { | 1081 if (previous_search_prefix == last_search_string_) { |
1079 return false; // Don't search this frame, it will be fruitless. | 1082 return false; // Don't search this frame, it will be fruitless. |
1080 } | 1083 } |
1081 } | 1084 } |
1082 | 1085 |
1083 return true; | 1086 return true; |
1084 } | 1087 } |
1085 | 1088 |
1086 void WebFrameImpl::InvalidateIfNecessary() { | 1089 void WebFrameImpl::InvalidateIfNecessary() { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 Vector<WebCore::DocumentMarker> markers = | 1130 Vector<WebCore::DocumentMarker> markers = |
1128 frame()->document()->markersForNode(node); | 1131 frame()->document()->markersForNode(node); |
1129 frame()->document()->setRenderedRectForMarker( | 1132 frame()->document()->setRenderedRectForMarker( |
1130 textPiece->startContainer(exception), | 1133 textPiece->startContainer(exception), |
1131 markers[markers.size() - 1], | 1134 markers[markers.size() - 1], |
1132 range->boundingBox()); | 1135 range->boundingBox()); |
1133 } | 1136 } |
1134 } | 1137 } |
1135 } | 1138 } |
1136 | 1139 |
1137 void WebFrameImpl::ScopeStringMatches(const WebFindInPageRequest& request, | 1140 void WebFrameImpl::ScopeStringMatches(int request_id, |
| 1141 const string16& search_text, |
| 1142 const WebFindOptions& options, |
1138 bool reset) { | 1143 bool reset) { |
1139 if (!ShouldScopeMatches(request)) | 1144 if (!ShouldScopeMatches(search_text)) |
1140 return; | 1145 return; |
1141 | 1146 |
1142 WebFrameImpl* main_frame_impl = | 1147 WebFrameImpl* main_frame_impl = |
1143 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); | 1148 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); |
1144 | 1149 |
1145 if (reset) { | 1150 if (reset) { |
1146 // This is a brand new search, so we need to reset everything. | 1151 // This is a brand new search, so we need to reset everything. |
1147 // Scoping is just about to begin. | 1152 // Scoping is just about to begin. |
1148 scoping_complete_ = false; | 1153 scoping_complete_ = false; |
1149 // Clear highlighting for this frame. | 1154 // Clear highlighting for this frame. |
1150 if (frame()->markedTextMatchesAreHighlighted()) | 1155 if (frame()->markedTextMatchesAreHighlighted()) |
1151 frame()->page()->unmarkAllTextMatches(); | 1156 frame()->page()->unmarkAllTextMatches(); |
1152 // Clear the counters from last operation. | 1157 // Clear the counters from last operation. |
1153 last_match_count_ = 0; | 1158 last_match_count_ = 0; |
1154 next_invalidate_after_ = 0; | 1159 next_invalidate_after_ = 0; |
1155 | 1160 |
1156 resume_scoping_from_range_ = NULL; | 1161 resume_scoping_from_range_ = NULL; |
1157 | 1162 |
1158 main_frame_impl->frames_scoping_count_++; | 1163 main_frame_impl->frames_scoping_count_++; |
1159 | 1164 |
1160 // Now, defer scoping until later to allow find operation to finish quickly. | 1165 // Now, defer scoping until later to allow find operation to finish quickly. |
1161 MessageLoop::current()->PostTask(FROM_HERE, | 1166 MessageLoop::current()->PostTask(FROM_HERE, |
1162 scope_matches_factory_.NewRunnableMethod( | 1167 scope_matches_factory_.NewRunnableMethod( |
1163 &WebFrameImpl::ScopeStringMatches, | 1168 &WebFrameImpl::ScopeStringMatches, |
1164 request, | 1169 request_id, |
| 1170 search_text, |
| 1171 options, |
1165 false)); // false=we just reset, so don't do it again. | 1172 false)); // false=we just reset, so don't do it again. |
1166 return; | 1173 return; |
1167 } | 1174 } |
1168 | 1175 |
1169 WebCore::String webcore_string = | 1176 WebCore::String webcore_string = webkit_glue::String16ToString(search_text); |
1170 webkit_glue::WebStringToString(request.text); | |
1171 | 1177 |
1172 RefPtr<Range> search_range(rangeOfContents(frame()->document())); | 1178 RefPtr<Range> search_range(rangeOfContents(frame()->document())); |
1173 | 1179 |
1174 ExceptionCode ec = 0, ec2 = 0; | 1180 ExceptionCode ec = 0, ec2 = 0; |
1175 if (resume_scoping_from_range_.get()) { | 1181 if (resume_scoping_from_range_.get()) { |
1176 // This is a continuation of a scoping operation that timed out and didn't | 1182 // This is a continuation of a scoping operation that timed out and didn't |
1177 // complete last time around, so we should start from where we left off. | 1183 // complete last time around, so we should start from where we left off. |
1178 search_range->setStart(resume_scoping_from_range_->startContainer(), | 1184 search_range->setStart(resume_scoping_from_range_->startContainer(), |
1179 resume_scoping_from_range_->startOffset(ec2) + 1, | 1185 resume_scoping_from_range_->startOffset(ec2) + 1, |
1180 ec); | 1186 ec); |
(...skipping 14 matching lines...) Expand all Loading... |
1195 Time start_time = Time::Now(); | 1201 Time start_time = Time::Now(); |
1196 do { | 1202 do { |
1197 // Find next occurrence of the search string. | 1203 // Find next occurrence of the search string. |
1198 // TODO(finnur): (http://b/1088245) This WebKit operation may run | 1204 // TODO(finnur): (http://b/1088245) This WebKit operation may run |
1199 // for longer than the timeout value, and is not interruptible as it is | 1205 // for longer than the timeout value, and is not interruptible as it is |
1200 // currently written. We may need to rewrite it with interruptibility in | 1206 // currently written. We may need to rewrite it with interruptibility in |
1201 // mind, or find an alternative. | 1207 // mind, or find an alternative. |
1202 RefPtr<Range> result_range(findPlainText(search_range.get(), | 1208 RefPtr<Range> result_range(findPlainText(search_range.get(), |
1203 webcore_string, | 1209 webcore_string, |
1204 true, | 1210 true, |
1205 request.matchCase)); | 1211 options.matchCase)); |
1206 if (result_range->collapsed(ec)) { | 1212 if (result_range->collapsed(ec)) { |
1207 if (!result_range->startContainer()->isInShadowTree()) | 1213 if (!result_range->startContainer()->isInShadowTree()) |
1208 break; | 1214 break; |
1209 | 1215 |
1210 search_range = rangeOfContents(frame()->document()); | 1216 search_range = rangeOfContents(frame()->document()); |
1211 search_range->setStartAfter( | 1217 search_range->setStartAfter( |
1212 result_range->startContainer()->shadowAncestorNode(), ec); | 1218 result_range->startContainer()->shadowAncestorNode(), ec); |
1213 continue; | 1219 continue; |
1214 } | 1220 } |
1215 | 1221 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 // find this rect during scoping it means we have found the active | 1256 // find this rect during scoping it means we have found the active |
1251 // tickmark. | 1257 // tickmark. |
1252 if (locating_active_rect_ && (active_selection_rect == result_bounds)) { | 1258 if (locating_active_rect_ && (active_selection_rect == result_bounds)) { |
1253 // We have found the active tickmark frame. | 1259 // We have found the active tickmark frame. |
1254 main_frame_impl->active_match_frame_ = this; | 1260 main_frame_impl->active_match_frame_ = this; |
1255 // We also know which tickmark is active now. | 1261 // We also know which tickmark is active now. |
1256 active_match_index_ = match_count - 1; | 1262 active_match_index_ = match_count - 1; |
1257 // To stop looking for the active tickmark, we set this flag. | 1263 // To stop looking for the active tickmark, we set this flag. |
1258 locating_active_rect_ = false; | 1264 locating_active_rect_ = false; |
1259 | 1265 |
1260 #if defined(OS_WIN) | 1266 #if defined(OS_WIN) |
1261 // TODO(pinkerton): Fix Mac invalidation to be more like Win ScrollView | 1267 // TODO(pinkerton): Fix Mac invalidation to be more like Win ScrollView |
1262 // Notify browser of new location for the selected rectangle. | 1268 // Notify browser of new location for the selected rectangle. |
1263 result_bounds.move(-frameview()->scrollOffset().width(), | 1269 result_bounds.move(-frameview()->scrollOffset().width(), |
1264 -frameview()->scrollOffset().height()); | 1270 -frameview()->scrollOffset().height()); |
1265 ReportFindInPageSelection( | 1271 ReportFindInPageSelection( |
1266 webkit_glue::FromIntRect( | 1272 webkit_glue::FromIntRect( |
1267 frame()->view()->convertToContainingWindow(result_bounds)), | 1273 frame()->view()->convertToContainingWindow(result_bounds)), |
1268 active_match_index_ + 1, | 1274 active_match_index_ + 1, |
1269 request.identifier); | 1275 request_id); |
1270 #endif | 1276 #endif |
1271 } | 1277 } |
1272 } | 1278 } |
1273 | 1279 |
1274 resume_scoping_from_range_ = result_range; | 1280 resume_scoping_from_range_ = result_range; |
1275 timeout = (Time::Now() - start_time).InMilliseconds() >= kTimeout; | 1281 timeout = (Time::Now() - start_time).InMilliseconds() >= kTimeout; |
1276 } while (!timeout); | 1282 } while (!timeout); |
1277 | 1283 |
1278 // Remember what we search for last time, so we can skip searching if more | 1284 // Remember what we search for last time, so we can skip searching if more |
1279 // letters are added to the search string (and last outcome was 0). | 1285 // letters are added to the search string (and last outcome was 0). |
1280 last_search_string_ = request.text; | 1286 last_search_string_ = search_text; |
1281 | 1287 |
1282 if (match_count > 0) { | 1288 if (match_count > 0) { |
1283 frame()->setMarkedTextMatchesAreHighlighted(true); | 1289 frame()->setMarkedTextMatchesAreHighlighted(true); |
1284 | 1290 |
1285 last_match_count_ += match_count; | 1291 last_match_count_ += match_count; |
1286 | 1292 |
1287 // Let the mainframe know how much we found during this pass. | 1293 // Let the mainframe know how much we found during this pass. |
1288 main_frame_impl->IncreaseMatchCount(match_count, request.identifier); | 1294 main_frame_impl->IncreaseMatchCount(match_count, request_id); |
1289 } | 1295 } |
1290 | 1296 |
1291 if (timeout) { | 1297 if (timeout) { |
1292 // If we found anything during this pass, we should redraw. However, we | 1298 // If we found anything during this pass, we should redraw. However, we |
1293 // don't want to spam too much if the page is extremely long, so if we | 1299 // don't want to spam too much if the page is extremely long, so if we |
1294 // reach a certain point we start throttling the redraw requests. | 1300 // reach a certain point we start throttling the redraw requests. |
1295 if (match_count > 0) | 1301 if (match_count > 0) |
1296 InvalidateIfNecessary(); | 1302 InvalidateIfNecessary(); |
1297 | 1303 |
1298 // Scoping effort ran out of time, lets ask for another time-slice. | 1304 // Scoping effort ran out of time, lets ask for another time-slice. |
1299 MessageLoop::current()->PostTask(FROM_HERE, | 1305 MessageLoop::current()->PostTask(FROM_HERE, |
1300 scope_matches_factory_.NewRunnableMethod( | 1306 scope_matches_factory_.NewRunnableMethod( |
1301 &WebFrameImpl::ScopeStringMatches, | 1307 &WebFrameImpl::ScopeStringMatches, |
1302 request, | 1308 request_id, |
| 1309 search_text, |
| 1310 options, |
1303 false)); // don't reset. | 1311 false)); // don't reset. |
1304 | 1312 |
1305 return; // Done for now, resume work later. | 1313 return; // Done for now, resume work later. |
1306 } | 1314 } |
1307 | 1315 |
1308 // This frame has no further scoping left, so it is done. Other frames might, | 1316 // This frame has no further scoping left, so it is done. Other frames might, |
1309 // of course, continue to scope matches. | 1317 // of course, continue to scope matches. |
1310 scoping_complete_ = true; | 1318 scoping_complete_ = true; |
1311 main_frame_impl->frames_scoping_count_--; | 1319 main_frame_impl->frames_scoping_count_--; |
1312 | 1320 |
1313 // If this is the last frame to finish scoping we need to trigger the final | 1321 // If this is the last frame to finish scoping we need to trigger the final |
1314 // update to be sent. | 1322 // update to be sent. |
1315 if (main_frame_impl->frames_scoping_count_ == 0) | 1323 if (main_frame_impl->frames_scoping_count_ == 0) |
1316 main_frame_impl->IncreaseMatchCount(0, request.identifier); | 1324 main_frame_impl->IncreaseMatchCount(0, request_id); |
1317 | 1325 |
1318 // This frame is done, so show any scrollbar tickmarks we haven't drawn yet. | 1326 // This frame is done, so show any scrollbar tickmarks we haven't drawn yet. |
1319 InvalidateArea(INVALIDATE_SCROLLBAR); | 1327 InvalidateArea(INVALIDATE_SCROLLBAR); |
1320 | |
1321 return; | |
1322 } | 1328 } |
1323 | 1329 |
1324 void WebFrameImpl::CancelPendingScopingEffort() { | 1330 void WebFrameImpl::CancelPendingScopingEffort() { |
1325 scope_matches_factory_.RevokeAll(); | 1331 scope_matches_factory_.RevokeAll(); |
1326 active_match_index_ = -1; | 1332 active_match_index_ = -1; |
1327 } | 1333 } |
1328 | 1334 |
1329 void WebFrameImpl::SetFindEndstateFocusAndSelection() { | 1335 void WebFrameImpl::SetFindEndstateFocusAndSelection() { |
1330 WebFrameImpl* main_frame_impl = | 1336 WebFrameImpl* main_frame_impl = |
1331 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); | 1337 static_cast<WebFrameImpl*>(GetView()->GetMainFrame()); |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1933 return password_listeners_.get(input_element); | 1939 return password_listeners_.get(input_element); |
1934 } | 1940 } |
1935 | 1941 |
1936 void WebFrameImpl::ClearPasswordListeners() { | 1942 void WebFrameImpl::ClearPasswordListeners() { |
1937 for (PasswordListenerMap::iterator iter = password_listeners_.begin(); | 1943 for (PasswordListenerMap::iterator iter = password_listeners_.begin(); |
1938 iter != password_listeners_.end(); ++iter) { | 1944 iter != password_listeners_.end(); ++iter) { |
1939 delete iter->second; | 1945 delete iter->second; |
1940 } | 1946 } |
1941 password_listeners_.clear(); | 1947 password_listeners_.clear(); |
1942 } | 1948 } |
OLD | NEW |