| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/history/history_backend.h" | 5 #include "chrome/browser/history/history_backend.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 } | 315 } |
| 316 visit_set.insert(visit_id); | 316 visit_set.insert(visit_id); |
| 317 } | 317 } |
| 318 return 0; | 318 return 0; |
| 319 } | 319 } |
| 320 | 320 |
| 321 SegmentID HistoryBackend::UpdateSegments( | 321 SegmentID HistoryBackend::UpdateSegments( |
| 322 const GURL& url, | 322 const GURL& url, |
| 323 VisitID from_visit, | 323 VisitID from_visit, |
| 324 VisitID visit_id, | 324 VisitID visit_id, |
| 325 content::PageTransition transition_type, | 325 ui::PageTransition transition_type, |
| 326 const Time ts) { | 326 const Time ts) { |
| 327 if (!db_) | 327 if (!db_) |
| 328 return 0; | 328 return 0; |
| 329 | 329 |
| 330 // We only consider main frames. | 330 // We only consider main frames. |
| 331 if (!content::PageTransitionIsMainFrame(transition_type)) | 331 if (!ui::PageTransitionIsMainFrame(transition_type)) |
| 332 return 0; | 332 return 0; |
| 333 | 333 |
| 334 SegmentID segment_id = 0; | 334 SegmentID segment_id = 0; |
| 335 content::PageTransition t = | 335 ui::PageTransition t = |
| 336 content::PageTransitionStripQualifier(transition_type); | 336 ui::PageTransitionStripQualifier(transition_type); |
| 337 | 337 |
| 338 // Are we at the beginning of a new segment? | 338 // Are we at the beginning of a new segment? |
| 339 // Note that navigating to an existing entry (with back/forward) reuses the | 339 // Note that navigating to an existing entry (with back/forward) reuses the |
| 340 // same transition type. We are not adding it as a new segment in that case | 340 // same transition type. We are not adding it as a new segment in that case |
| 341 // because if this was the target of a redirect, we might end up with | 341 // because if this was the target of a redirect, we might end up with |
| 342 // 2 entries for the same final URL. Ex: User types google.net, gets | 342 // 2 entries for the same final URL. Ex: User types google.net, gets |
| 343 // redirected to google.com. A segment is created for google.net. On | 343 // redirected to google.com. A segment is created for google.net. On |
| 344 // google.com users navigates through a link, then press back. That last | 344 // google.com users navigates through a link, then press back. That last |
| 345 // navigation is for the entry google.com transition typed. We end up adding | 345 // navigation is for the entry google.com transition typed. We end up adding |
| 346 // a segment for that one as well. So we end up with google.net and google.com | 346 // a segment for that one as well. So we end up with google.net and google.com |
| 347 // in the segment table, showing as 2 entries in the NTP. | 347 // in the segment table, showing as 2 entries in the NTP. |
| 348 // Note also that we should still be updating the visit count for that segment | 348 // Note also that we should still be updating the visit count for that segment |
| 349 // which we are not doing now. It should be addressed when | 349 // which we are not doing now. It should be addressed when |
| 350 // http://crbug.com/96860 is fixed. | 350 // http://crbug.com/96860 is fixed. |
| 351 if ((t == content::PAGE_TRANSITION_TYPED || | 351 if ((t == ui::PAGE_TRANSITION_TYPED || |
| 352 t == content::PAGE_TRANSITION_AUTO_BOOKMARK) && | 352 t == ui::PAGE_TRANSITION_AUTO_BOOKMARK) && |
| 353 (transition_type & content::PAGE_TRANSITION_FORWARD_BACK) == 0) { | 353 (transition_type & ui::PAGE_TRANSITION_FORWARD_BACK) == 0) { |
| 354 // If so, create or get the segment. | 354 // If so, create or get the segment. |
| 355 std::string segment_name = db_->ComputeSegmentName(url); | 355 std::string segment_name = db_->ComputeSegmentName(url); |
| 356 URLID url_id = db_->GetRowForURL(url, NULL); | 356 URLID url_id = db_->GetRowForURL(url, NULL); |
| 357 if (!url_id) | 357 if (!url_id) |
| 358 return 0; | 358 return 0; |
| 359 | 359 |
| 360 segment_id = db_->GetSegmentNamed(segment_name); | 360 segment_id = db_->GetSegmentNamed(segment_name); |
| 361 if (!segment_id) { | 361 if (!segment_id) { |
| 362 segment_id = db_->CreateSegment(url_id, segment_name); | 362 segment_id = db_->CreateSegment(url_id, segment_name); |
| 363 if (!segment_id) { | 363 if (!segment_id) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 // If a redirect chain is given, we expect the last item in that chain to be | 430 // If a redirect chain is given, we expect the last item in that chain to be |
| 431 // the final URL. | 431 // the final URL. |
| 432 DCHECK(request.redirects.empty() || | 432 DCHECK(request.redirects.empty() || |
| 433 request.redirects.back() == request.url); | 433 request.redirects.back() == request.url); |
| 434 | 434 |
| 435 // If the user is adding older history, we need to make sure our times | 435 // If the user is adding older history, we need to make sure our times |
| 436 // are correct. | 436 // are correct. |
| 437 if (request.time < first_recorded_time_) | 437 if (request.time < first_recorded_time_) |
| 438 first_recorded_time_ = request.time; | 438 first_recorded_time_ = request.time; |
| 439 | 439 |
| 440 content::PageTransition request_transition = request.transition; | 440 ui::PageTransition request_transition = request.transition; |
| 441 content::PageTransition stripped_transition = | 441 ui::PageTransition stripped_transition = |
| 442 content::PageTransitionStripQualifier(request_transition); | 442 ui::PageTransitionStripQualifier(request_transition); |
| 443 bool is_keyword_generated = | 443 bool is_keyword_generated = |
| 444 (stripped_transition == content::PAGE_TRANSITION_KEYWORD_GENERATED); | 444 (stripped_transition == ui::PAGE_TRANSITION_KEYWORD_GENERATED); |
| 445 | 445 |
| 446 // If the user is navigating to a not-previously-typed intranet hostname, | 446 // If the user is navigating to a not-previously-typed intranet hostname, |
| 447 // change the transition to TYPED so that the omnibox will learn that this is | 447 // change the transition to TYPED so that the omnibox will learn that this is |
| 448 // a known host. | 448 // a known host. |
| 449 bool has_redirects = request.redirects.size() > 1; | 449 bool has_redirects = request.redirects.size() > 1; |
| 450 if (content::PageTransitionIsMainFrame(request_transition) && | 450 if (ui::PageTransitionIsMainFrame(request_transition) && |
| 451 (stripped_transition != content::PAGE_TRANSITION_TYPED) && | 451 (stripped_transition != ui::PAGE_TRANSITION_TYPED) && |
| 452 !is_keyword_generated) { | 452 !is_keyword_generated) { |
| 453 const GURL& origin_url(has_redirects ? | 453 const GURL& origin_url(has_redirects ? |
| 454 request.redirects[0] : request.url); | 454 request.redirects[0] : request.url); |
| 455 if (origin_url.SchemeIs(url::kHttpScheme) || | 455 if (origin_url.SchemeIs(url::kHttpScheme) || |
| 456 origin_url.SchemeIs(url::kHttpsScheme) || | 456 origin_url.SchemeIs(url::kHttpsScheme) || |
| 457 origin_url.SchemeIs(url::kFtpScheme)) { | 457 origin_url.SchemeIs(url::kFtpScheme)) { |
| 458 std::string host(origin_url.host()); | 458 std::string host(origin_url.host()); |
| 459 size_t registry_length = | 459 size_t registry_length = |
| 460 net::registry_controlled_domains::GetRegistryLength( | 460 net::registry_controlled_domains::GetRegistryLength( |
| 461 host, | 461 host, |
| 462 net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, | 462 net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, |
| 463 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); | 463 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); |
| 464 if (registry_length == 0 && !db_->IsTypedHost(host)) { | 464 if (registry_length == 0 && !db_->IsTypedHost(host)) { |
| 465 stripped_transition = content::PAGE_TRANSITION_TYPED; | 465 stripped_transition = ui::PAGE_TRANSITION_TYPED; |
| 466 request_transition = | 466 request_transition = |
| 467 content::PageTransitionFromInt( | 467 ui::PageTransitionFromInt( |
| 468 stripped_transition | | 468 stripped_transition | |
| 469 content::PageTransitionGetQualifier(request_transition)); | 469 ui::PageTransitionGetQualifier(request_transition)); |
| 470 } | 470 } |
| 471 } | 471 } |
| 472 } | 472 } |
| 473 | 473 |
| 474 if (!has_redirects) { | 474 if (!has_redirects) { |
| 475 // The single entry is both a chain start and end. | 475 // The single entry is both a chain start and end. |
| 476 content::PageTransition t = content::PageTransitionFromInt( | 476 ui::PageTransition t = ui::PageTransitionFromInt( |
| 477 request_transition | | 477 request_transition | |
| 478 content::PAGE_TRANSITION_CHAIN_START | | 478 ui::PAGE_TRANSITION_CHAIN_START | |
| 479 content::PAGE_TRANSITION_CHAIN_END); | 479 ui::PAGE_TRANSITION_CHAIN_END); |
| 480 | 480 |
| 481 // No redirect case (one element means just the page itself). | 481 // No redirect case (one element means just the page itself). |
| 482 last_ids = AddPageVisit(request.url, request.time, | 482 last_ids = AddPageVisit(request.url, request.time, |
| 483 last_ids.second, t, request.visit_source); | 483 last_ids.second, t, request.visit_source); |
| 484 | 484 |
| 485 // Update the segment for this visit. KEYWORD_GENERATED visits should not | 485 // Update the segment for this visit. KEYWORD_GENERATED visits should not |
| 486 // result in changing most visited, so we don't update segments (most | 486 // result in changing most visited, so we don't update segments (most |
| 487 // visited db). | 487 // visited db). |
| 488 if (!is_keyword_generated) { | 488 if (!is_keyword_generated) { |
| 489 UpdateSegments(request.url, from_visit_id, last_ids.second, t, | 489 UpdateSegments(request.url, from_visit_id, last_ids.second, t, |
| 490 request.time); | 490 request.time); |
| 491 | 491 |
| 492 // Update the referrer's duration. | 492 // Update the referrer's duration. |
| 493 UpdateVisitDuration(from_visit_id, request.time); | 493 UpdateVisitDuration(from_visit_id, request.time); |
| 494 } | 494 } |
| 495 } else { | 495 } else { |
| 496 // Redirect case. Add the redirect chain. | 496 // Redirect case. Add the redirect chain. |
| 497 | 497 |
| 498 content::PageTransition redirect_info = | 498 ui::PageTransition redirect_info = |
| 499 content::PAGE_TRANSITION_CHAIN_START; | 499 ui::PAGE_TRANSITION_CHAIN_START; |
| 500 | 500 |
| 501 RedirectList redirects = request.redirects; | 501 RedirectList redirects = request.redirects; |
| 502 if (redirects[0].SchemeIs(url::kAboutScheme)) { | 502 if (redirects[0].SchemeIs(url::kAboutScheme)) { |
| 503 // When the redirect source + referrer is "about" we skip it. This | 503 // When the redirect source + referrer is "about" we skip it. This |
| 504 // happens when a page opens a new frame/window to about:blank and then | 504 // happens when a page opens a new frame/window to about:blank and then |
| 505 // script sets the URL to somewhere else (used to hide the referrer). It | 505 // script sets the URL to somewhere else (used to hide the referrer). It |
| 506 // would be nice to keep all these redirects properly but we don't ever | 506 // would be nice to keep all these redirects properly but we don't ever |
| 507 // see the initial about:blank load, so we don't know where the | 507 // see the initial about:blank load, so we don't know where the |
| 508 // subsequent client redirect came from. | 508 // subsequent client redirect came from. |
| 509 // | 509 // |
| 510 // In this case, we just don't bother hooking up the source of the | 510 // In this case, we just don't bother hooking up the source of the |
| 511 // redirects, so we remove it. | 511 // redirects, so we remove it. |
| 512 redirects.erase(redirects.begin()); | 512 redirects.erase(redirects.begin()); |
| 513 } else if (request_transition & content::PAGE_TRANSITION_CLIENT_REDIRECT) { | 513 } else if (request_transition & ui::PAGE_TRANSITION_CLIENT_REDIRECT) { |
| 514 redirect_info = content::PAGE_TRANSITION_CLIENT_REDIRECT; | 514 redirect_info = ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
| 515 // The first entry in the redirect chain initiated a client redirect. | 515 // The first entry in the redirect chain initiated a client redirect. |
| 516 // We don't add this to the database since the referrer is already | 516 // We don't add this to the database since the referrer is already |
| 517 // there, so we skip over it but change the transition type of the first | 517 // there, so we skip over it but change the transition type of the first |
| 518 // transition to client redirect. | 518 // transition to client redirect. |
| 519 // | 519 // |
| 520 // The referrer is invalid when restoring a session that features an | 520 // The referrer is invalid when restoring a session that features an |
| 521 // https tab that redirects to a different host or to http. In this | 521 // https tab that redirects to a different host or to http. In this |
| 522 // case we don't need to reconnect the new redirect with the existing | 522 // case we don't need to reconnect the new redirect with the existing |
| 523 // chain. | 523 // chain. |
| 524 if (request.referrer.is_valid()) { | 524 if (request.referrer.is_valid()) { |
| 525 DCHECK(request.referrer == redirects[0]); | 525 DCHECK(request.referrer == redirects[0]); |
| 526 redirects.erase(redirects.begin()); | 526 redirects.erase(redirects.begin()); |
| 527 | 527 |
| 528 // If the navigation entry for this visit has replaced that for the | 528 // If the navigation entry for this visit has replaced that for the |
| 529 // first visit, remove the CHAIN_END marker from the first visit. This | 529 // first visit, remove the CHAIN_END marker from the first visit. This |
| 530 // can be called a lot, for example, the page cycler, and most of the | 530 // can be called a lot, for example, the page cycler, and most of the |
| 531 // time we won't have changed anything. | 531 // time we won't have changed anything. |
| 532 VisitRow visit_row; | 532 VisitRow visit_row; |
| 533 if (request.did_replace_entry && | 533 if (request.did_replace_entry && |
| 534 db_->GetRowForVisit(last_ids.second, &visit_row) && | 534 db_->GetRowForVisit(last_ids.second, &visit_row) && |
| 535 visit_row.transition & content::PAGE_TRANSITION_CHAIN_END) { | 535 visit_row.transition & ui::PAGE_TRANSITION_CHAIN_END) { |
| 536 visit_row.transition = content::PageTransitionFromInt( | 536 visit_row.transition = ui::PageTransitionFromInt( |
| 537 visit_row.transition & ~content::PAGE_TRANSITION_CHAIN_END); | 537 visit_row.transition & ~ui::PAGE_TRANSITION_CHAIN_END); |
| 538 db_->UpdateVisitRow(visit_row); | 538 db_->UpdateVisitRow(visit_row); |
| 539 } | 539 } |
| 540 } | 540 } |
| 541 } | 541 } |
| 542 | 542 |
| 543 for (size_t redirect_index = 0; redirect_index < redirects.size(); | 543 for (size_t redirect_index = 0; redirect_index < redirects.size(); |
| 544 redirect_index++) { | 544 redirect_index++) { |
| 545 content::PageTransition t = | 545 ui::PageTransition t = |
| 546 content::PageTransitionFromInt(stripped_transition | redirect_info); | 546 ui::PageTransitionFromInt(stripped_transition | redirect_info); |
| 547 | 547 |
| 548 // If this is the last transition, add a CHAIN_END marker | 548 // If this is the last transition, add a CHAIN_END marker |
| 549 if (redirect_index == (redirects.size() - 1)) { | 549 if (redirect_index == (redirects.size() - 1)) { |
| 550 t = content::PageTransitionFromInt( | 550 t = ui::PageTransitionFromInt( |
| 551 t | content::PAGE_TRANSITION_CHAIN_END); | 551 t | ui::PAGE_TRANSITION_CHAIN_END); |
| 552 } | 552 } |
| 553 | 553 |
| 554 // Record all redirect visits with the same timestamp. We don't display | 554 // Record all redirect visits with the same timestamp. We don't display |
| 555 // them anyway, and if we ever decide to, we can reconstruct their order | 555 // them anyway, and if we ever decide to, we can reconstruct their order |
| 556 // from the redirect chain. | 556 // from the redirect chain. |
| 557 last_ids = AddPageVisit(redirects[redirect_index], | 557 last_ids = AddPageVisit(redirects[redirect_index], |
| 558 request.time, last_ids.second, | 558 request.time, last_ids.second, |
| 559 t, request.visit_source); | 559 t, request.visit_source); |
| 560 if (t & content::PAGE_TRANSITION_CHAIN_START) { | 560 if (t & ui::PAGE_TRANSITION_CHAIN_START) { |
| 561 // Update the segment for this visit. | 561 // Update the segment for this visit. |
| 562 UpdateSegments(redirects[redirect_index], | 562 UpdateSegments(redirects[redirect_index], |
| 563 from_visit_id, last_ids.second, t, request.time); | 563 from_visit_id, last_ids.second, t, request.time); |
| 564 | 564 |
| 565 // Update the visit_details for this visit. | 565 // Update the visit_details for this visit. |
| 566 UpdateVisitDuration(from_visit_id, request.time); | 566 UpdateVisitDuration(from_visit_id, request.time); |
| 567 } | 567 } |
| 568 | 568 |
| 569 // Subsequent transitions in the redirect list must all be server | 569 // Subsequent transitions in the redirect list must all be server |
| 570 // redirects. | 570 // redirects. |
| 571 redirect_info = content::PAGE_TRANSITION_SERVER_REDIRECT; | 571 redirect_info = ui::PAGE_TRANSITION_SERVER_REDIRECT; |
| 572 } | 572 } |
| 573 | 573 |
| 574 // Last, save this redirect chain for later so we can set titles & favicons | 574 // Last, save this redirect chain for later so we can set titles & favicons |
| 575 // on the redirected pages properly. | 575 // on the redirected pages properly. |
| 576 recent_redirects_.Put(request.url, redirects); | 576 recent_redirects_.Put(request.url, redirects); |
| 577 } | 577 } |
| 578 | 578 |
| 579 // TODO(brettw) bug 1140015: Add an "add page" notification so the history | 579 // TODO(brettw) bug 1140015: Add an "add page" notification so the history |
| 580 // views can keep in sync. | 580 // views can keep in sync. |
| 581 | 581 |
| 582 // Add the last visit to the tracker so we can get outgoing transitions. | 582 // Add the last visit to the tracker so we can get outgoing transitions. |
| 583 // TODO(evanm): Due to http://b/1194536 we lose the referrers of a subframe | 583 // TODO(evanm): Due to http://b/1194536 we lose the referrers of a subframe |
| 584 // navigation anyway, so last_visit_id is always zero for them. But adding | 584 // navigation anyway, so last_visit_id is always zero for them. But adding |
| 585 // them here confuses main frame history, so we skip them for now. | 585 // them here confuses main frame history, so we skip them for now. |
| 586 if (stripped_transition != content::PAGE_TRANSITION_AUTO_SUBFRAME && | 586 if (stripped_transition != ui::PAGE_TRANSITION_AUTO_SUBFRAME && |
| 587 stripped_transition != content::PAGE_TRANSITION_MANUAL_SUBFRAME && | 587 stripped_transition != ui::PAGE_TRANSITION_MANUAL_SUBFRAME && |
| 588 !is_keyword_generated) { | 588 !is_keyword_generated) { |
| 589 tracker_.AddVisit(request.context_id, request.page_id, request.url, | 589 tracker_.AddVisit(request.context_id, request.page_id, request.url, |
| 590 last_ids.second); | 590 last_ids.second); |
| 591 } | 591 } |
| 592 | 592 |
| 593 ScheduleCommit(); | 593 ScheduleCommit(); |
| 594 } | 594 } |
| 595 | 595 |
| 596 void HistoryBackend::InitImpl(const std::string& languages) { | 596 void HistoryBackend::InitImpl(const std::string& languages) { |
| 597 DCHECK(!db_) << "Initializing HistoryBackend twice"; | 597 DCHECK(!db_) << "Initializing HistoryBackend twice"; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 if (thumbnail_db_) { | 727 if (thumbnail_db_) { |
| 728 thumbnail_db_->CommitTransaction(); | 728 thumbnail_db_->CommitTransaction(); |
| 729 thumbnail_db_.reset(); | 729 thumbnail_db_.reset(); |
| 730 } | 730 } |
| 731 } | 731 } |
| 732 | 732 |
| 733 std::pair<URLID, VisitID> HistoryBackend::AddPageVisit( | 733 std::pair<URLID, VisitID> HistoryBackend::AddPageVisit( |
| 734 const GURL& url, | 734 const GURL& url, |
| 735 Time time, | 735 Time time, |
| 736 VisitID referring_visit, | 736 VisitID referring_visit, |
| 737 content::PageTransition transition, | 737 ui::PageTransition transition, |
| 738 VisitSource visit_source) { | 738 VisitSource visit_source) { |
| 739 // Top-level frame navigations are visible, everything else is hidden | 739 // Top-level frame navigations are visible, everything else is hidden |
| 740 bool new_hidden = !content::PageTransitionIsMainFrame(transition); | 740 bool new_hidden = !ui::PageTransitionIsMainFrame(transition); |
| 741 | 741 |
| 742 // NOTE: This code must stay in sync with | 742 // NOTE: This code must stay in sync with |
| 743 // ExpireHistoryBackend::ExpireURLsForVisits(). | 743 // ExpireHistoryBackend::ExpireURLsForVisits(). |
| 744 // TODO(pkasting): http://b/1148304 We shouldn't be marking so many URLs as | 744 // TODO(pkasting): http://b/1148304 We shouldn't be marking so many URLs as |
| 745 // typed, which would eliminate the need for this code. | 745 // typed, which would eliminate the need for this code. |
| 746 int typed_increment = 0; | 746 int typed_increment = 0; |
| 747 content::PageTransition transition_type = | 747 ui::PageTransition transition_type = |
| 748 content::PageTransitionStripQualifier(transition); | 748 ui::PageTransitionStripQualifier(transition); |
| 749 if ((transition_type == content::PAGE_TRANSITION_TYPED && | 749 if ((transition_type == ui::PAGE_TRANSITION_TYPED && |
| 750 !content::PageTransitionIsRedirect(transition)) || | 750 !ui::PageTransitionIsRedirect(transition)) || |
| 751 transition_type == content::PAGE_TRANSITION_KEYWORD_GENERATED) | 751 transition_type == ui::PAGE_TRANSITION_KEYWORD_GENERATED) |
| 752 typed_increment = 1; | 752 typed_increment = 1; |
| 753 | 753 |
| 754 #if defined(OS_ANDROID) | 754 #if defined(OS_ANDROID) |
| 755 // Only count the page visit if it came from user browsing and only count it | 755 // Only count the page visit if it came from user browsing and only count it |
| 756 // once when cycling through a redirect chain. | 756 // once when cycling through a redirect chain. |
| 757 if (visit_source == SOURCE_BROWSED && | 757 if (visit_source == SOURCE_BROWSED && |
| 758 (transition & content::PAGE_TRANSITION_CHAIN_END) != 0) { | 758 (transition & ui::PAGE_TRANSITION_CHAIN_END) != 0) { |
| 759 RecordTopPageVisitStats(url); | 759 RecordTopPageVisitStats(url); |
| 760 } | 760 } |
| 761 #endif | 761 #endif |
| 762 | 762 |
| 763 // See if this URL is already in the DB. | 763 // See if this URL is already in the DB. |
| 764 URLRow url_info(url); | 764 URLRow url_info(url); |
| 765 URLID url_id = db_->GetRowForURL(url, &url_info); | 765 URLID url_id = db_->GetRowForURL(url, &url_info); |
| 766 if (url_id) { | 766 if (url_id) { |
| 767 // Update of an existing row. | 767 // Update of an existing row. |
| 768 if (content::PageTransitionStripQualifier(transition) != | 768 if (ui::PageTransitionStripQualifier(transition) != |
| 769 content::PAGE_TRANSITION_RELOAD) | 769 ui::PAGE_TRANSITION_RELOAD) |
| 770 url_info.set_visit_count(url_info.visit_count() + 1); | 770 url_info.set_visit_count(url_info.visit_count() + 1); |
| 771 if (typed_increment) | 771 if (typed_increment) |
| 772 url_info.set_typed_count(url_info.typed_count() + typed_increment); | 772 url_info.set_typed_count(url_info.typed_count() + typed_increment); |
| 773 if (url_info.last_visit() < time) | 773 if (url_info.last_visit() < time) |
| 774 url_info.set_last_visit(time); | 774 url_info.set_last_visit(time); |
| 775 | 775 |
| 776 // Only allow un-hiding of pages, never hiding. | 776 // Only allow un-hiding of pages, never hiding. |
| 777 if (!new_hidden) | 777 if (!new_hidden) |
| 778 url_info.set_hidden(false); | 778 url_info.set_hidden(false); |
| 779 | 779 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 } | 847 } |
| 848 | 848 |
| 849 modified->changed_urls.push_back(*i); | 849 modified->changed_urls.push_back(*i); |
| 850 modified->changed_urls.back().set_id(url_id); // i->id_ is likely 0. | 850 modified->changed_urls.back().set_id(url_id); // i->id_ is likely 0. |
| 851 } | 851 } |
| 852 | 852 |
| 853 // Sync code manages the visits itself. | 853 // Sync code manages the visits itself. |
| 854 if (visit_source != SOURCE_SYNCED) { | 854 if (visit_source != SOURCE_SYNCED) { |
| 855 // Make up a visit to correspond to the last visit to the page. | 855 // Make up a visit to correspond to the last visit to the page. |
| 856 VisitRow visit_info(url_id, i->last_visit(), 0, | 856 VisitRow visit_info(url_id, i->last_visit(), 0, |
| 857 content::PageTransitionFromInt( | 857 ui::PageTransitionFromInt( |
| 858 content::PAGE_TRANSITION_LINK | | 858 ui::PAGE_TRANSITION_LINK | |
| 859 content::PAGE_TRANSITION_CHAIN_START | | 859 ui::PAGE_TRANSITION_CHAIN_START | |
| 860 content::PAGE_TRANSITION_CHAIN_END), 0); | 860 ui::PAGE_TRANSITION_CHAIN_END), 0); |
| 861 if (!db_->AddVisit(&visit_info, visit_source)) { | 861 if (!db_->AddVisit(&visit_info, visit_source)) { |
| 862 NOTREACHED() << "Adding visit failed."; | 862 NOTREACHED() << "Adding visit failed."; |
| 863 return; | 863 return; |
| 864 } | 864 } |
| 865 NotifyVisitObservers(visit_info); | 865 NotifyVisitObservers(visit_info); |
| 866 | 866 |
| 867 if (visit_info.visit_time < first_recorded_time_) | 867 if (visit_info.visit_time < first_recorded_time_) |
| 868 first_recorded_time_ = visit_info.visit_time; | 868 first_recorded_time_ = visit_info.visit_time; |
| 869 } | 869 } |
| 870 } | 870 } |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 << visit.url_id << ": " | 1246 << visit.url_id << ": " |
| 1247 << url_result.url().possibly_invalid_spec(); | 1247 << url_result.url().possibly_invalid_spec(); |
| 1248 continue; // Don't report invalid URLs in case of corruption. | 1248 continue; // Don't report invalid URLs in case of corruption. |
| 1249 } | 1249 } |
| 1250 | 1250 |
| 1251 url_result.set_visit_time(visit.visit_time); | 1251 url_result.set_visit_time(visit.visit_time); |
| 1252 | 1252 |
| 1253 // Set whether the visit was blocked for a managed user by looking at the | 1253 // Set whether the visit was blocked for a managed user by looking at the |
| 1254 // transition type. | 1254 // transition type. |
| 1255 url_result.set_blocked_visit( | 1255 url_result.set_blocked_visit( |
| 1256 (visit.transition & content::PAGE_TRANSITION_BLOCKED) != 0); | 1256 (visit.transition & ui::PAGE_TRANSITION_BLOCKED) != 0); |
| 1257 | 1257 |
| 1258 // We don't set any of the query-specific parts of the URLResult, since | 1258 // We don't set any of the query-specific parts of the URLResult, since |
| 1259 // snippets and stuff don't apply to basic querying. | 1259 // snippets and stuff don't apply to basic querying. |
| 1260 result->AppendURLBySwapping(&url_result); | 1260 result->AppendURLBySwapping(&url_result); |
| 1261 } | 1261 } |
| 1262 | 1262 |
| 1263 if (!has_more_results && options.begin_time <= first_recorded_time_) | 1263 if (!has_more_results && options.begin_time <= first_recorded_time_) |
| 1264 result->set_reached_beginning(true); | 1264 result->set_reached_beginning(true); |
| 1265 } | 1265 } |
| 1266 | 1266 |
| (...skipping 1436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2703 int rank = kPageVisitStatsMaxTopSites; | 2703 int rank = kPageVisitStatsMaxTopSites; |
| 2704 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); | 2704 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); |
| 2705 if (it != most_visited_urls_map_.end()) | 2705 if (it != most_visited_urls_map_.end()) |
| 2706 rank = (*it).second; | 2706 rank = (*it).second; |
| 2707 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", | 2707 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", |
| 2708 rank, kPageVisitStatsMaxTopSites + 1); | 2708 rank, kPageVisitStatsMaxTopSites + 1); |
| 2709 } | 2709 } |
| 2710 #endif | 2710 #endif |
| 2711 | 2711 |
| 2712 } // namespace history | 2712 } // namespace history |
| OLD | NEW |