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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 #include "SelectionController.h" | 121 #include "SelectionController.h" |
122 #include "Settings.h" | 122 #include "Settings.h" |
123 #include "SkiaUtils.h" | 123 #include "SkiaUtils.h" |
124 #include "SubstituteData.h" | 124 #include "SubstituteData.h" |
125 #include "TextIterator.h" | 125 #include "TextIterator.h" |
126 #include "TextAffinity.h" | 126 #include "TextAffinity.h" |
127 #include "XPathResult.h" | 127 #include "XPathResult.h" |
128 #include <wtf/CurrentTime.h> | 128 #include <wtf/CurrentTime.h> |
129 #undef LOG | 129 #undef LOG |
130 | 130 |
131 #include "base/message_loop.h" | |
132 #include "webkit/api/public/WebConsoleMessage.h" | 131 #include "webkit/api/public/WebConsoleMessage.h" |
133 #include "webkit/api/public/WebFindOptions.h" | 132 #include "webkit/api/public/WebFindOptions.h" |
134 #include "webkit/api/public/WebForm.h" | 133 #include "webkit/api/public/WebForm.h" |
135 #include "webkit/api/public/WebFrameClient.h" | 134 #include "webkit/api/public/WebFrameClient.h" |
136 #include "webkit/api/public/WebHistoryItem.h" | 135 #include "webkit/api/public/WebHistoryItem.h" |
137 #include "webkit/api/public/WebRange.h" | 136 #include "webkit/api/public/WebRange.h" |
138 #include "webkit/api/public/WebRect.h" | 137 #include "webkit/api/public/WebRect.h" |
139 #include "webkit/api/public/WebScriptSource.h" | 138 #include "webkit/api/public/WebScriptSource.h" |
140 #include "webkit/api/public/WebSecurityOrigin.h" | 139 #include "webkit/api/public/WebSecurityOrigin.h" |
141 #include "webkit/api/public/WebSize.h" | 140 #include "webkit/api/public/WebSize.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 using WebCore::ResourceHandle; | 181 using WebCore::ResourceHandle; |
183 using WebCore::ResourceRequest; | 182 using WebCore::ResourceRequest; |
184 using WebCore::ResourceResponse; | 183 using WebCore::ResourceResponse; |
185 using WebCore::VisibleSelection; | 184 using WebCore::VisibleSelection; |
186 using WebCore::ScriptValue; | 185 using WebCore::ScriptValue; |
187 using WebCore::SecurityOrigin; | 186 using WebCore::SecurityOrigin; |
188 using WebCore::SharedBuffer; | 187 using WebCore::SharedBuffer; |
189 using WebCore::String; | 188 using WebCore::String; |
190 using WebCore::SubstituteData; | 189 using WebCore::SubstituteData; |
191 using WebCore::TextIterator; | 190 using WebCore::TextIterator; |
| 191 using WebCore::Timer; |
192 using WebCore::VisiblePosition; | 192 using WebCore::VisiblePosition; |
193 using WebCore::XPathResult; | 193 using WebCore::XPathResult; |
194 | 194 |
195 using WebKit::PasswordAutocompleteListener; | 195 using WebKit::PasswordAutocompleteListener; |
196 using WebKit::WebCanvas; | 196 using WebKit::WebCanvas; |
197 using WebKit::WebConsoleMessage; | 197 using WebKit::WebConsoleMessage; |
198 using WebKit::WebData; | 198 using WebKit::WebData; |
199 using WebKit::WebDataSource; | 199 using WebKit::WebDataSource; |
200 using WebKit::WebDataSourceImpl; | 200 using WebKit::WebDataSourceImpl; |
201 using WebKit::WebFindOptions; | 201 using WebKit::WebFindOptions; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 float printed_page_width_; | 341 float printed_page_width_; |
342 | 342 |
343 private: | 343 private: |
344 DISALLOW_COPY_AND_ASSIGN(ChromePrintContext); | 344 DISALLOW_COPY_AND_ASSIGN(ChromePrintContext); |
345 }; | 345 }; |
346 | 346 |
347 static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader) { | 347 static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader) { |
348 return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : NULL; | 348 return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : NULL; |
349 } | 349 } |
350 | 350 |
| 351 |
| 352 // WebFrame ------------------------------------------------------------------- |
| 353 |
| 354 class WebFrameImpl::DeferredScopeStringMatches { |
| 355 public: |
| 356 DeferredScopeStringMatches(WebFrameImpl* webframe, |
| 357 int identifier, |
| 358 const WebString& search_text, |
| 359 const WebFindOptions& options, |
| 360 bool reset) |
| 361 : timer_(this, &DeferredScopeStringMatches::DoTimeout), |
| 362 webframe_(webframe), |
| 363 identifier_(identifier), |
| 364 search_text_(search_text), |
| 365 options_(options), |
| 366 reset_(reset) { |
| 367 timer_.startOneShot(0.0); |
| 368 } |
| 369 |
| 370 private: |
| 371 void DoTimeout(Timer<DeferredScopeStringMatches>*) { |
| 372 webframe_->CallScopeStringMatches( |
| 373 this, identifier_, search_text_, options_, reset_); |
| 374 } |
| 375 |
| 376 Timer<DeferredScopeStringMatches> timer_; |
| 377 RefPtr<WebFrameImpl> webframe_; |
| 378 int identifier_; |
| 379 WebString search_text_; |
| 380 WebFindOptions options_; |
| 381 bool reset_; |
| 382 }; |
| 383 |
| 384 |
351 // WebFrame ------------------------------------------------------------------- | 385 // WebFrame ------------------------------------------------------------------- |
352 | 386 |
353 // static | 387 // static |
354 WebFrame* WebFrame::frameForEnteredContext() { | 388 WebFrame* WebFrame::frameForEnteredContext() { |
355 Frame* frame = | 389 Frame* frame = |
356 WebCore::ScriptController::retrieveFrameForEnteredContext(); | 390 WebCore::ScriptController::retrieveFrameForEnteredContext(); |
357 return WebFrameImpl::FromFrame(frame); | 391 return WebFrameImpl::FromFrame(frame); |
358 } | 392 } |
359 | 393 |
360 // static | 394 // static |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 frame()->page()->unmarkAllTextMatches(); | 1254 frame()->page()->unmarkAllTextMatches(); |
1221 // Clear the counters from last operation. | 1255 // Clear the counters from last operation. |
1222 last_match_count_ = 0; | 1256 last_match_count_ = 0; |
1223 next_invalidate_after_ = 0; | 1257 next_invalidate_after_ = 0; |
1224 | 1258 |
1225 resume_scoping_from_range_ = NULL; | 1259 resume_scoping_from_range_ = NULL; |
1226 | 1260 |
1227 main_frame_impl->frames_scoping_count_++; | 1261 main_frame_impl->frames_scoping_count_++; |
1228 | 1262 |
1229 // Now, defer scoping until later to allow find operation to finish quickly. | 1263 // Now, defer scoping until later to allow find operation to finish quickly. |
1230 // TODO(darin): Replace with a WebCore Timer. | 1264 ScopeStringMatchesSoon( |
1231 MessageLoop::current()->PostTask(FROM_HERE, | 1265 request_id, |
1232 scope_matches_factory_.NewRunnableMethod( | 1266 search_text, |
1233 &WebFrameImpl::scopeStringMatches, | 1267 options, |
1234 request_id, | 1268 false); // false=we just reset, so don't do it again. |
1235 search_text, | |
1236 options, | |
1237 false)); // false=we just reset, so don't do it again. | |
1238 return; | 1269 return; |
1239 } | 1270 } |
1240 | 1271 |
1241 WebCore::String webcore_string = webkit_glue::String16ToString(search_text); | 1272 WebCore::String webcore_string = webkit_glue::String16ToString(search_text); |
1242 | 1273 |
1243 RefPtr<Range> search_range(rangeOfContents(frame()->document())); | 1274 RefPtr<Range> search_range(rangeOfContents(frame()->document())); |
1244 | 1275 |
1245 ExceptionCode ec = 0, ec2 = 0; | 1276 ExceptionCode ec = 0, ec2 = 0; |
1246 if (resume_scoping_from_range_.get()) { | 1277 if (resume_scoping_from_range_.get()) { |
1247 // This is a continuation of a scoping operation that timed out and didn't | 1278 // This is a continuation of a scoping operation that timed out and didn't |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 } | 1390 } |
1360 | 1391 |
1361 if (timeout) { | 1392 if (timeout) { |
1362 // If we found anything during this pass, we should redraw. However, we | 1393 // If we found anything during this pass, we should redraw. However, we |
1363 // don't want to spam too much if the page is extremely long, so if we | 1394 // don't want to spam too much if the page is extremely long, so if we |
1364 // reach a certain point we start throttling the redraw requests. | 1395 // reach a certain point we start throttling the redraw requests. |
1365 if (match_count > 0) | 1396 if (match_count > 0) |
1366 InvalidateIfNecessary(); | 1397 InvalidateIfNecessary(); |
1367 | 1398 |
1368 // Scoping effort ran out of time, lets ask for another time-slice. | 1399 // Scoping effort ran out of time, lets ask for another time-slice. |
1369 // TODO(darin): Replace with a WebCore Timer. | 1400 ScopeStringMatchesSoon( |
1370 MessageLoop::current()->PostTask(FROM_HERE, | 1401 request_id, |
1371 scope_matches_factory_.NewRunnableMethod( | 1402 search_text, |
1372 &WebFrameImpl::scopeStringMatches, | 1403 options, |
1373 request_id, | 1404 false); // don't reset. |
1374 search_text, | |
1375 options, | |
1376 false)); // don't reset. | |
1377 | |
1378 return; // Done for now, resume work later. | 1405 return; // Done for now, resume work later. |
1379 } | 1406 } |
1380 | 1407 |
1381 // This frame has no further scoping left, so it is done. Other frames might, | 1408 // This frame has no further scoping left, so it is done. Other frames might, |
1382 // of course, continue to scope matches. | 1409 // of course, continue to scope matches. |
1383 scoping_complete_ = true; | 1410 scoping_complete_ = true; |
1384 main_frame_impl->frames_scoping_count_--; | 1411 main_frame_impl->frames_scoping_count_--; |
1385 | 1412 |
1386 // If this is the last frame to finish scoping we need to trigger the final | 1413 // If this is the last frame to finish scoping we need to trigger the final |
1387 // update to be sent. | 1414 // update to be sent. |
1388 if (main_frame_impl->frames_scoping_count_ == 0) | 1415 if (main_frame_impl->frames_scoping_count_ == 0) |
1389 main_frame_impl->increaseMatchCount(0, request_id); | 1416 main_frame_impl->increaseMatchCount(0, request_id); |
1390 | 1417 |
1391 // This frame is done, so show any scrollbar tickmarks we haven't drawn yet. | 1418 // This frame is done, so show any scrollbar tickmarks we haven't drawn yet. |
1392 InvalidateArea(INVALIDATE_SCROLLBAR); | 1419 InvalidateArea(INVALIDATE_SCROLLBAR); |
1393 } | 1420 } |
1394 | 1421 |
1395 void WebFrameImpl::cancelPendingScopingEffort() { | 1422 void WebFrameImpl::cancelPendingScopingEffort() { |
1396 scope_matches_factory_.RevokeAll(); | 1423 deleteAllValues(deferred_scoping_work_); |
| 1424 deferred_scoping_work_.clear(); |
| 1425 |
1397 active_match_index_ = -1; | 1426 active_match_index_ = -1; |
1398 } | 1427 } |
1399 | 1428 |
1400 void WebFrameImpl::increaseMatchCount(int count, int request_id) { | 1429 void WebFrameImpl::increaseMatchCount(int count, int request_id) { |
1401 // This function should only be called on the mainframe. | 1430 // This function should only be called on the mainframe. |
1402 ASSERT(!parent()); | 1431 ASSERT(!parent()); |
1403 | 1432 |
1404 total_matchcount_ += count; | 1433 total_matchcount_ += count; |
1405 | 1434 |
1406 // Update the UI with the latest findings. | 1435 // Update the UI with the latest findings. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1450 // WebFrameImpl public --------------------------------------------------------- | 1479 // WebFrameImpl public --------------------------------------------------------- |
1451 | 1480 |
1452 int WebFrameImpl::live_object_count_ = 0; | 1481 int WebFrameImpl::live_object_count_ = 0; |
1453 | 1482 |
1454 PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client) { | 1483 PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client) { |
1455 return adoptRef(new WebFrameImpl(ClientHandle::create(client))); | 1484 return adoptRef(new WebFrameImpl(ClientHandle::create(client))); |
1456 } | 1485 } |
1457 | 1486 |
1458 WebFrameImpl::WebFrameImpl(PassRefPtr<ClientHandle> client_handle) | 1487 WebFrameImpl::WebFrameImpl(PassRefPtr<ClientHandle> client_handle) |
1459 : ALLOW_THIS_IN_INITIALIZER_LIST(frame_loader_client_(this)), | 1488 : ALLOW_THIS_IN_INITIALIZER_LIST(frame_loader_client_(this)), |
1460 ALLOW_THIS_IN_INITIALIZER_LIST(scope_matches_factory_(this)), | |
1461 client_handle_(client_handle), | 1489 client_handle_(client_handle), |
1462 active_match_frame_(NULL), | 1490 active_match_frame_(NULL), |
1463 active_match_index_(-1), | 1491 active_match_index_(-1), |
1464 locating_active_rect_(false), | 1492 locating_active_rect_(false), |
1465 resume_scoping_from_range_(NULL), | 1493 resume_scoping_from_range_(NULL), |
1466 last_match_count_(-1), | 1494 last_match_count_(-1), |
1467 total_matchcount_(-1), | 1495 total_matchcount_(-1), |
1468 frames_scoping_count_(-1), | 1496 frames_scoping_count_(-1), |
1469 scoping_complete_(false), | 1497 scoping_complete_(false), |
1470 next_invalidate_after_(0) { | 1498 next_invalidate_after_(0) { |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1816 search_text.substr(0, last_search_string_.length()); | 1844 search_text.substr(0, last_search_string_.length()); |
1817 | 1845 |
1818 if (previous_search_prefix == last_search_string_) { | 1846 if (previous_search_prefix == last_search_string_) { |
1819 return false; // Don't search this frame, it will be fruitless. | 1847 return false; // Don't search this frame, it will be fruitless. |
1820 } | 1848 } |
1821 } | 1849 } |
1822 | 1850 |
1823 return true; | 1851 return true; |
1824 } | 1852 } |
1825 | 1853 |
| 1854 void WebFrameImpl::ScopeStringMatchesSoon( |
| 1855 int identifier, const WebString& search_text, |
| 1856 const WebFindOptions& options, bool reset) { |
| 1857 deferred_scoping_work_.append(new DeferredScopeStringMatches( |
| 1858 this, identifier, search_text, options, reset)); |
| 1859 } |
| 1860 |
| 1861 void WebFrameImpl::CallScopeStringMatches( |
| 1862 DeferredScopeStringMatches* caller, int identifier, |
| 1863 const WebString& search_text, const WebFindOptions& options, bool reset) { |
| 1864 deferred_scoping_work_.remove(deferred_scoping_work_.find(caller)); |
| 1865 |
| 1866 scopeStringMatches(identifier, search_text, options, reset); |
| 1867 |
| 1868 // This needs to happen last since search_text is passed by reference. |
| 1869 delete caller; |
| 1870 } |
| 1871 |
1826 void WebFrameImpl::InvalidateIfNecessary() { | 1872 void WebFrameImpl::InvalidateIfNecessary() { |
1827 if (last_match_count_ > next_invalidate_after_) { | 1873 if (last_match_count_ > next_invalidate_after_) { |
1828 // TODO(finnur): (http://b/1088165) Optimize the drawing of the | 1874 // TODO(finnur): (http://b/1088165) Optimize the drawing of the |
1829 // tickmarks and remove this. This calculation sets a milestone for when | 1875 // tickmarks and remove this. This calculation sets a milestone for when |
1830 // next to invalidate the scrollbar and the content area. We do this so that | 1876 // next to invalidate the scrollbar and the content area. We do this so that |
1831 // we don't spend too much time drawing the scrollbar over and over again. | 1877 // we don't spend too much time drawing the scrollbar over and over again. |
1832 // Basically, up until the first 500 matches there is no throttle. After the | 1878 // Basically, up until the first 500 matches there is no throttle. After the |
1833 // first 500 matches, we set set the milestone further and further out (750, | 1879 // first 500 matches, we set set the milestone further and further out (750, |
1834 // 1125, 1688, 2K, 3K). | 1880 // 1125, 1688, 2K, 3K). |
1835 static const int start_slowing_down_after = 500; | 1881 static const int start_slowing_down_after = 500; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1870 | 1916 |
1871 SecurityOrigin* security_origin = frame_->document()->securityOrigin(); | 1917 SecurityOrigin* security_origin = frame_->document()->securityOrigin(); |
1872 | 1918 |
1873 if (!frame_->redirectScheduler()->locationChangePending()) { | 1919 if (!frame_->redirectScheduler()->locationChangePending()) { |
1874 frame_->loader()->stopAllLoaders(); | 1920 frame_->loader()->stopAllLoaders(); |
1875 frame_->loader()->begin(frame_->loader()->url(), true, security_origin); | 1921 frame_->loader()->begin(frame_->loader()->url(), true, security_origin); |
1876 frame_->loader()->write(script_result); | 1922 frame_->loader()->write(script_result); |
1877 frame_->loader()->end(); | 1923 frame_->loader()->end(); |
1878 } | 1924 } |
1879 } | 1925 } |
OLD | NEW |