Chromium Code Reviews| 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 src="../uber/uber_utils.js"> | 5 <include src="../uber/uber_utils.js"> |
| 6 | 6 |
| 7 /////////////////////////////////////////////////////////////////////////////// | 7 /////////////////////////////////////////////////////////////////////////////// |
| 8 // Globals: | 8 // Globals: |
| 9 /** @const */ var RESULTS_PER_PAGE = 150; | 9 /** @const */ var RESULTS_PER_PAGE = 150; |
| 10 | 10 |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 }; | 350 }; |
| 351 | 351 |
| 352 /** | 352 /** |
| 353 * Reload our model with the current parameters. | 353 * Reload our model with the current parameters. |
| 354 */ | 354 */ |
| 355 HistoryModel.prototype.reload = function() { | 355 HistoryModel.prototype.reload = function() { |
| 356 // Save user-visible state, clear the model, and restore the state. | 356 // Save user-visible state, clear the model, and restore the state. |
| 357 var search = this.searchText_; | 357 var search = this.searchText_; |
| 358 var page = this.requestedPage_; | 358 var page = this.requestedPage_; |
| 359 var range = this.rangeInDays_; | 359 var range = this.rangeInDays_; |
| 360 var offset = this.offset_; | |
| 360 var groupByDomain = this.groupByDomain_; | 361 var groupByDomain = this.groupByDomain_; |
| 361 | 362 |
| 362 this.clearModel_(); | 363 this.clearModel_(); |
| 363 this.searchText_ = search; | 364 this.searchText_ = search; |
| 364 this.requestedPage_ = page; | 365 this.requestedPage_ = page; |
| 365 this.rangeInDays_ = range; | 366 this.rangeInDays_ = range; |
| 367 this.offset_ = offset; | |
| 366 this.groupByDomain_ = groupByDomain; | 368 this.groupByDomain_ = groupByDomain; |
| 367 this.queryHistory_(); | 369 this.queryHistory_(); |
| 368 }; | 370 }; |
| 369 | 371 |
| 370 /** | 372 /** |
| 371 * @return {string} The current search text. | 373 * @return {string} The current search text. |
| 372 */ | 374 */ |
| 373 HistoryModel.prototype.getSearchText = function() { | 375 HistoryModel.prototype.getSearchText = function() { |
| 374 return this.searchText_; | 376 return this.searchText_; |
| 375 }; | 377 }; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 459 // Getter and setter for HistoryModel.rangeInDays_. | 461 // Getter and setter for HistoryModel.rangeInDays_. |
| 460 Object.defineProperty(HistoryModel.prototype, 'rangeInDays', { | 462 Object.defineProperty(HistoryModel.prototype, 'rangeInDays', { |
| 461 get: function() { | 463 get: function() { |
| 462 return this.rangeInDays_; | 464 return this.rangeInDays_; |
| 463 }, | 465 }, |
| 464 set: function(range) { | 466 set: function(range) { |
| 465 this.rangeInDays_ = range; | 467 this.rangeInDays_ = range; |
| 466 } | 468 } |
| 467 }); | 469 }); |
| 468 | 470 |
| 471 /** | |
| 472 * Getter and setter for HistoryModel.offset_. The offset moves the current | |
| 473 * query 'window' |range| days behind. As such for range set to WEEK an offset | |
| 474 * of 0 refers to the last 7 days, an offset of 1 refers to the 7 day period | |
| 475 * that ended 7 days ago, etc. For MONTH an offset of 0 refers to the current | |
| 476 * calendar month, 1 to the previous one, etc. | |
| 477 */ | |
| 478 Object.defineProperty(HistoryModel.prototype, 'offset', { | |
| 479 get: function() { | |
| 480 return this.offset_; | |
| 481 }, | |
| 482 set: function(offset) { | |
| 483 this.offset_ = offset; | |
| 484 } | |
| 485 }); | |
| 486 | |
| 469 // HistoryModel, Private: ----------------------------------------------------- | 487 // HistoryModel, Private: ----------------------------------------------------- |
| 470 | 488 |
| 471 /** | 489 /** |
| 472 * Clear the history model. | 490 * Clear the history model. |
| 473 * @private | 491 * @private |
| 474 */ | 492 */ |
| 475 HistoryModel.prototype.clearModel_ = function() { | 493 HistoryModel.prototype.clearModel_ = function() { |
| 476 this.inFlight_ = false; // Whether a query is inflight. | 494 this.inFlight_ = false; // Whether a query is inflight. |
| 477 this.searchText_ = ''; | 495 this.searchText_ = ''; |
| 478 // Flag to show that the results are grouped by domain or not. | 496 // Flag to show that the results are grouped by domain or not. |
| 479 this.groupByDomain_ = false; | 497 this.groupByDomain_ = false; |
| 480 | 498 |
| 481 this.visits_ = []; // Date-sorted list of visits (most recent first). | 499 this.visits_ = []; // Date-sorted list of visits (most recent first). |
| 482 this.last_id_ = 0; | 500 this.last_id_ = 0; |
| 483 selectionAnchor = -1; | 501 selectionAnchor = -1; |
| 484 | 502 |
| 485 // The page that the view wants to see - we only fetch slightly past this | 503 // The page that the view wants to see - we only fetch slightly past this |
| 486 // point. If the view requests a page that we don't have data for, we try | 504 // point. If the view requests a page that we don't have data for, we try |
| 487 // to fetch it and call back when we're done. | 505 // to fetch it and call back when we're done. |
| 488 this.requestedPage_ = 0; | 506 this.requestedPage_ = 0; |
| 489 | 507 |
| 508 // Skip |offset_| * weeks/months from the begining. | |
| 509 this.offset_ = 0; | |
| 510 | |
| 490 // The range of history to view or search over, WEEK by default. | 511 // The range of history to view or search over, WEEK by default. |
| 491 this.rangeInDays_ = HistoryModel.Range.WEEK; | 512 this.rangeInDays_ = HistoryModel.Range.WEEK; |
| 492 | 513 |
| 493 // Keeps track of whether or not there are more results available than are | 514 // Keeps track of whether or not there are more results available than are |
| 494 // currently held in |this.visits_|. | 515 // currently held in |this.visits_|. |
| 495 this.isQueryFinished_ = false; | 516 this.isQueryFinished_ = false; |
| 496 | 517 |
| 497 // An opaque value that is returned with the query results. This is used to | 518 // An opaque value that is returned with the query results. This is used to |
| 498 // fetch the next page of results for a query. | 519 // fetch the next page of results for a query. |
| 499 this.queryCursor_ = null; | 520 this.queryCursor_ = null; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 526 // Show the result or a message if no results were returned. | 547 // Show the result or a message if no results were returned. |
| 527 this.view_.onModelReady(); | 548 this.view_.onModelReady(); |
| 528 }; | 549 }; |
| 529 | 550 |
| 530 /** | 551 /** |
| 531 * Query for history, either for a search or time-based browsing. | 552 * Query for history, either for a search or time-based browsing. |
| 532 * @private | 553 * @private |
| 533 */ | 554 */ |
| 534 HistoryModel.prototype.queryHistory_ = function() { | 555 HistoryModel.prototype.queryHistory_ = function() { |
| 535 var endTime = 0; | 556 var endTime = 0; |
| 536 // Set the range to the values from the interface. | 557 // Set the range and offset to the values from the interface. |
| 558 var offset = this.offset_; | |
| 537 var range = this.rangeInDays_; | 559 var range = this.rangeInDays_; |
| 538 if (!this.getGroupByDomain()) { | 560 if (!this.getGroupByDomain()) { |
| 539 // Do the time-based search. | 561 // Do the time-based search. |
| 540 // If there are already some visits, pick up the previous query where it | 562 // If there are already some visits, pick up the previous query where it |
| 541 // left off. | 563 // left off. |
| 542 if (this.visits_.length > 0) { | 564 if (this.visits_.length > 0) { |
| 543 var lastVisit = this.visits_.slice(-1)[0]; | 565 var lastVisit = this.visits_.slice(-1)[0]; |
| 544 endTime = lastVisit.date.getTime(); | 566 endTime = lastVisit.date.getTime(); |
| 545 cursor = this.queryCursor_; | 567 cursor = this.queryCursor_; |
| 546 } | 568 } |
| 547 range = HistoryModel.Range.NOT_GROUPED; | 569 range = HistoryModel.Range.NOT_GROUPED; |
| 548 } | 570 } |
| 549 $('loading-spinner').hidden = false; | 571 $('loading-spinner').hidden = false; |
| 550 this.inFlight_ = true; | 572 this.inFlight_ = true; |
| 551 chrome.send('queryHistory', | 573 chrome.send('queryHistory', |
| 552 [this.searchText_, range, endTime, this.queryCursor_, | 574 [this.searchText_, offset, range, endTime, this.queryCursor_, |
| 553 RESULTS_PER_PAGE]); | 575 RESULTS_PER_PAGE]); |
| 554 }; | 576 }; |
| 555 | 577 |
| 556 /** | 578 /** |
| 557 * Check to see if we have data for the given page. | 579 * Check to see if we have data for the given page. |
| 558 * @param {number} page The page number. | 580 * @param {number} page The page number. |
| 559 * @return {boolean} Whether we have any data for the given page. | 581 * @return {boolean} Whether we have any data for the given page. |
| 560 * @private | 582 * @private |
| 561 */ | 583 */ |
| 562 HistoryModel.prototype.haveDataForPage_ = function(page) { | 584 HistoryModel.prototype.haveDataForPage_ = function(page) { |
| 563 return (page * RESULTS_PER_PAGE < this.getSize()); | 585 return (page * RESULTS_PER_PAGE < this.getSize()); |
| 564 }; | 586 }; |
| 565 | 587 |
| 566 /** | 588 /** |
| 567 * Check to see if we have data to fill the given page. | 589 * Check to see if we have data to fill the given page. |
| 568 * @param {number} page The page number. | 590 * @param {number} page The page number. |
| 569 * @return {boolean} Whether we have data to fill the page. | 591 * @return {boolean} Whether we have data to fill the page. |
| 570 * @private | 592 * @private |
| 571 */ | 593 */ |
| 572 HistoryModel.prototype.canFillPage_ = function(page) { | 594 HistoryModel.prototype.canFillPage_ = function(page) { |
| 573 return ((page + 1) * RESULTS_PER_PAGE <= this.getSize()); | 595 return ((page + 1) * RESULTS_PER_PAGE <= this.getSize()); |
| 574 }; | 596 }; |
| 575 | 597 |
| 576 /** | 598 /** |
| 577 * Enables or disables grouping by domain. | 599 * Enables or disables grouping by domain. |
| 578 * @param {boolean} groupByDomain New groupByDomain_ value. | 600 * @param {boolean} groupByDomain New groupByDomain_ value. |
| 579 */ | 601 */ |
| 580 HistoryModel.prototype.setGroupByDomain = function(groupByDomain) { | 602 HistoryModel.prototype.setGroupByDomain = function(groupByDomain) { |
| 581 this.groupByDomain_ = groupByDomain; | 603 this.groupByDomain_ = groupByDomain; |
| 604 this.offset_ = 0; | |
| 582 }; | 605 }; |
| 583 | 606 |
| 584 /** | 607 /** |
| 585 * Gets whether we are grouped by domain. | 608 * Gets whether we are grouped by domain. |
| 586 * @return {boolean} Whether the results are grouped by domain. | 609 * @return {boolean} Whether the results are grouped by domain. |
| 587 */ | 610 */ |
| 588 HistoryModel.prototype.getGroupByDomain = function() { | 611 HistoryModel.prototype.getGroupByDomain = function() { |
| 589 return this.groupByDomain_; | 612 return this.groupByDomain_; |
| 590 }; | 613 }; |
| 591 | 614 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 }); | 652 }); |
| 630 | 653 |
| 631 // Add handlers for the range options. | 654 // Add handlers for the range options. |
| 632 $('timeframe-filter').addEventListener('change', function(e) { | 655 $('timeframe-filter').addEventListener('change', function(e) { |
| 633 self.setRangeInDays(parseInt(e.target.value, 10)); | 656 self.setRangeInDays(parseInt(e.target.value, 10)); |
| 634 }); | 657 }); |
| 635 | 658 |
| 636 $('display-filter-sites').addEventListener('click', function(e) { | 659 $('display-filter-sites').addEventListener('click', function(e) { |
| 637 self.setGroupByDomain($('display-filter-sites').checked); | 660 self.setGroupByDomain($('display-filter-sites').checked); |
| 638 }); | 661 }); |
| 662 | |
| 663 $('range-previous').addEventListener('click', function(e) { | |
| 664 self.setOffset(self.getOffset() + 1); | |
| 665 }); | |
| 666 $('range-next').addEventListener('click', function(e) { | |
| 667 self.setOffset(self.getOffset() - 1); | |
| 668 }); | |
| 669 $('range-today').addEventListener('click', function(e) { | |
| 670 self.setOffset(0); | |
| 671 }); | |
| 639 } | 672 } |
| 640 | 673 |
| 641 // HistoryView, public: ------------------------------------------------------- | 674 // HistoryView, public: ------------------------------------------------------- |
| 642 /** | 675 /** |
| 643 * Do a search and optionally view a certain page. | 676 * Do a search and optionally view a certain page. |
| 644 * @param {string} term The string to search for. | 677 * @param {string} term The string to search for. |
| 645 * @param {number} opt_page The page we wish to view, only use this for | 678 * @param {number} opt_page The page we wish to view, only use this for |
| 646 * setting up initial views, as this triggers a search. | 679 * setting up initial views, as this triggers a search. |
| 647 */ | 680 */ |
| 648 HistoryView.prototype.setSearch = function(term, opt_page) { | 681 HistoryView.prototype.setSearch = function(term, opt_page) { |
| 649 this.pageIndex_ = parseInt(opt_page || 0, 10); | 682 this.pageIndex_ = parseInt(opt_page || 0, 10); |
| 650 window.scrollTo(0, 0); | 683 window.scrollTo(0, 0); |
| 651 this.model_.setSearchText(term, this.pageIndex_); | 684 this.model_.setSearchText(term, this.pageIndex_); |
| 652 pageState.setUIState(term, this.pageIndex_, this.model_.getGroupByDomain(), | 685 pageState.setUIState(term, this.pageIndex_, this.model_.getGroupByDomain(), |
| 653 this.getRangeInDays()); | 686 this.getRangeInDays(), this.getOffset()); |
| 654 }; | 687 }; |
| 655 | 688 |
| 656 /** | 689 /** |
| 657 * Enable or disable results as being grouped by domain. | 690 * Enable or disable results as being grouped by domain. |
| 658 * @param {boolean} groupedByDomain Whether to group by domain or not. | 691 * @param {boolean} groupedByDomain Whether to group by domain or not. |
| 659 */ | 692 */ |
| 660 HistoryView.prototype.setGroupByDomain = function(groupedByDomain) { | 693 HistoryView.prototype.setGroupByDomain = function(groupedByDomain) { |
| 661 // Group by domain is not currently supported for search results, so reset | 694 // Group by domain is not currently supported for search results, so reset |
| 662 // the search term if there was one. | 695 // the search term if there was one. |
| 663 this.model_.clearSearchText(); | 696 this.model_.clearSearchText(); |
| 664 this.model_.setGroupByDomain(groupedByDomain); | 697 this.model_.setGroupByDomain(groupedByDomain); |
| 665 $('timeframe-filter').disabled = !groupedByDomain; | 698 setRangeButtonsState(groupedByDomain, this); |
| 666 this.model_.reload(); | 699 this.model_.reload(); |
| 667 pageState.setUIState(this.model_.getSearchText(), | 700 pageState.setUIState(this.model_.getSearchText(), |
| 668 this.pageIndex_, | 701 this.pageIndex_, |
| 669 this.model_.getGroupByDomain(), | 702 this.model_.getGroupByDomain(), |
| 670 this.getRangeInDays()); | 703 this.getRangeInDays(), |
| 704 this.getOffset()); | |
| 671 }; | 705 }; |
| 672 | 706 |
| 673 /** | 707 /** |
| 674 * Reload the current view. | 708 * Reload the current view. |
| 675 */ | 709 */ |
| 676 HistoryView.prototype.reload = function() { | 710 HistoryView.prototype.reload = function() { |
| 677 this.model_.reload(); | 711 this.model_.reload(); |
| 678 this.updateRemoveButton(); | 712 this.updateRemoveButton(); |
| 679 }; | 713 }; |
| 680 | 714 |
| 681 /** | 715 /** |
| 682 * Switch to a specified page. | 716 * Switch to a specified page. |
| 683 * @param {number} page The page we wish to view. | 717 * @param {number} page The page we wish to view. |
| 684 */ | 718 */ |
| 685 HistoryView.prototype.setPage = function(page) { | 719 HistoryView.prototype.setPage = function(page) { |
| 686 this.clear_(); | 720 this.clear_(); |
| 687 this.pageIndex_ = parseInt(page, 10); | 721 this.pageIndex_ = parseInt(page, 10); |
| 688 window.scrollTo(0, 0); | 722 window.scrollTo(0, 0); |
| 689 this.model_.requestPage(page); | 723 this.model_.requestPage(page); |
| 690 pageState.setUIState(this.model_.getSearchText(), | 724 pageState.setUIState(this.model_.getSearchText(), |
| 691 this.pageIndex_, | 725 this.pageIndex_, |
| 692 this.model_.getGroupByDomain(), | 726 this.model_.getGroupByDomain(), |
| 693 this.getRangeInDays()); | 727 this.getRangeInDays(), |
| 728 this.getOffset()); | |
| 694 }; | 729 }; |
| 695 | 730 |
| 696 /** | 731 /** |
| 697 * @return {number} The page number being viewed. | 732 * @return {number} The page number being viewed. |
| 698 */ | 733 */ |
| 699 HistoryView.prototype.getPage = function() { | 734 HistoryView.prototype.getPage = function() { |
| 700 return this.pageIndex_; | 735 return this.pageIndex_; |
| 701 }; | 736 }; |
| 702 | 737 |
| 703 /** | 738 /** |
| 704 * Set the current range for grouped results. | 739 * Set the current range for grouped results. |
| 705 * @param {string} range The number of days to which the range should be set. | 740 * @param {string} range The number of days to which the range should be set. |
| 706 */ | 741 */ |
| 707 HistoryView.prototype.setRangeInDays = function(range) { | 742 HistoryView.prototype.setRangeInDays = function(range) { |
| 708 window.scrollTo(0, 0); | 743 window.scrollTo(0, 0); |
| 709 // Set the range and reset the offset. | 744 // Set the range and reset the offset. |
| 745 this.model_.offset = 0; | |
| 710 this.model_.rangeInDays = range; | 746 this.model_.rangeInDays = range; |
| 747 setRangeButtonsState(true, this); | |
| 711 this.model_.reload(); | 748 this.model_.reload(); |
| 712 pageState.setUIState(this.model_.getSearchText(), this.pageIndex_, | 749 pageState.setUIState(this.model_.getSearchText(), this.pageIndex_, |
| 713 this.model_.getGroupByDomain(), range); | 750 this.model_.getGroupByDomain(), range, this.getOffset()); |
| 714 }; | 751 }; |
| 715 | 752 |
| 716 /** | 753 /** |
| 717 * Get the current range in days. | 754 * Get the current range in days. |
| 718 * @return {number} Current range in days from the model. | 755 * @return {number} Current range in days from the model. |
| 719 */ | 756 */ |
| 720 HistoryView.prototype.getRangeInDays = function() { | 757 HistoryView.prototype.getRangeInDays = function() { |
| 721 return this.model_.rangeInDays; | 758 return this.model_.rangeInDays; |
| 722 }; | 759 }; |
| 723 | 760 |
| 724 /** | 761 /** |
| 762 * Set the current offset for grouped results. | |
| 763 * @param {number} offset Offset to set. | |
| 764 */ | |
| 765 HistoryView.prototype.setOffset = function(offset) { | |
| 766 window.scrollTo(0, 0); | |
| 767 this.model_.offset = offset; | |
| 768 this.model_.reload(); | |
| 769 setRangeButtonsState(true, this); | |
| 770 pageState.setUIState(this.model_.getSearchText(), | |
| 771 this.pageIndex_, | |
| 772 this.model_.getGroupByDomain(), | |
| 773 this.getRangeInDays(), | |
| 774 this.getOffset()); | |
| 775 }; | |
| 776 | |
| 777 /** | |
| 778 * Get the current offset. | |
| 779 * @return {number} Current offset from the model. | |
| 780 */ | |
| 781 HistoryView.prototype.getOffset = function() { | |
| 782 return this.model_.offset; | |
| 783 }; | |
| 784 | |
| 785 /** | |
| 725 * Callback for the history model to let it know that it has data ready for us | 786 * Callback for the history model to let it know that it has data ready for us |
| 726 * to view. | 787 * to view. |
| 727 */ | 788 */ |
| 728 HistoryView.prototype.onModelReady = function() { | 789 HistoryView.prototype.onModelReady = function() { |
| 729 this.displayResults_(); | 790 this.displayResults_(); |
| 730 this.updateNavBar_(); | 791 this.updateNavBar_(); |
| 731 }; | 792 }; |
| 732 | 793 |
| 733 /** | 794 /** |
| 734 * Enables or disables the 'Remove selected items' button as appropriate. | 795 * Enables or disables the 'Remove selected items' button as appropriate. |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 946 createElementWithClassName('h2', 'timeframe')); | 1007 createElementWithClassName('h2', 'timeframe')); |
| 947 timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF( | 1008 timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF( |
| 948 'historyinterval', | 1009 'historyinterval', |
| 949 this.model_.queryStartTime, | 1010 this.model_.queryStartTime, |
| 950 this.model_.queryEndTime))); | 1011 this.model_.queryEndTime))); |
| 951 } | 1012 } |
| 952 | 1013 |
| 953 if (results.length == 0) { | 1014 if (results.length == 0) { |
| 954 var noResults = document.createElement('div'); | 1015 var noResults = document.createElement('div'); |
| 955 noResults.textContent = loadTimeData.getString('noresults'); | 1016 noResults.textContent = loadTimeData.getString('noresults'); |
| 956 this.resultDiv_.appendChild(noResults); | 1017 resultsFragment.appendChild(noResults); |
| 1018 this.resultDiv_.appendChild(resultsFragment); | |
| 957 this.updateNavBar_(); | 1019 this.updateNavBar_(); |
| 958 return; | 1020 return; |
| 959 } | 1021 } |
| 960 | 1022 |
| 961 if (this.model_.getGroupByDomain() && | 1023 if (this.model_.getGroupByDomain() && |
| 962 this.getRangeInDays() == HistoryModel.Range.MONTH) { | 1024 this.getRangeInDays() == HistoryModel.Range.MONTH) { |
| 963 // Group everything together in the month view. | 1025 // Group everything together in the month view. |
| 964 this.addMonthResults_(results, resultsFragment); | 1026 this.addMonthResults_(results, resultsFragment); |
| 965 } else { | 1027 } else { |
| 966 var dayStart = 0; | 1028 var dayStart = 0; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1023 var hashData = state_obj.getHashData(); | 1085 var hashData = state_obj.getHashData(); |
| 1024 if (hashData.q != state_obj.model.getSearchText()) { | 1086 if (hashData.q != state_obj.model.getSearchText()) { |
| 1025 state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10)); | 1087 state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10)); |
| 1026 } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) { | 1088 } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) { |
| 1027 state_obj.view.setPage(hashData.p); | 1089 state_obj.view.setPage(hashData.p); |
| 1028 } else if ((hashData.g == 'true') != | 1090 } else if ((hashData.g == 'true') != |
| 1029 state_obj.view.model_.getGroupByDomain()) { | 1091 state_obj.view.model_.getGroupByDomain()) { |
| 1030 state_obj.view.setGroupByDomain(hashData.g); | 1092 state_obj.view.setGroupByDomain(hashData.g); |
| 1031 } else if (parseInt(hashData.r, 10) != state_obj.model.rangeInDays) { | 1093 } else if (parseInt(hashData.r, 10) != state_obj.model.rangeInDays) { |
| 1032 state_obj.view.setRangeInDays(parseInt(hashData.r, 10)); | 1094 state_obj.view.setRangeInDays(parseInt(hashData.r, 10)); |
| 1095 } else if (parseInt(hashData.o, 10) != state_obj.model.offset) { | |
| 1096 state_obj.view.setOffset(parseInt(hashData.o, 10)); | |
| 1033 } | 1097 } |
| 1034 }), 50, this); | 1098 }), 50, this); |
| 1035 } | 1099 } |
| 1036 | 1100 |
| 1037 /** | 1101 /** |
| 1038 * Holds the singleton instance. | 1102 * Holds the singleton instance. |
| 1039 */ | 1103 */ |
| 1040 PageState.instance = null; | 1104 PageState.instance = null; |
| 1041 | 1105 |
| 1042 /** | 1106 /** |
| 1043 * @return {Object} An object containing parameters from our window hash. | 1107 * @return {Object} An object containing parameters from our window hash. |
| 1044 */ | 1108 */ |
| 1045 PageState.prototype.getHashData = function() { | 1109 PageState.prototype.getHashData = function() { |
| 1046 var result = { | 1110 var result = { |
| 1047 e: 0, | 1111 e: 0, |
| 1048 q: '', | 1112 q: '', |
| 1049 p: 0, | 1113 p: 0, |
| 1050 g: false, | 1114 g: false, |
| 1051 r: 0 | 1115 r: 0, |
| 1116 o: 0 | |
| 1052 }; | 1117 }; |
| 1053 | 1118 |
| 1054 if (!window.location.hash) | 1119 if (!window.location.hash) |
| 1055 return result; | 1120 return result; |
| 1056 | 1121 |
| 1057 var hashSplit = window.location.hash.substr(1).split('&'); | 1122 var hashSplit = window.location.hash.substr(1).split('&'); |
| 1058 for (var i = 0; i < hashSplit.length; i++) { | 1123 for (var i = 0; i < hashSplit.length; i++) { |
| 1059 var pair = hashSplit[i].split('='); | 1124 var pair = hashSplit[i].split('='); |
| 1060 if (pair.length > 1) { | 1125 if (pair.length > 1) { |
| 1061 result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); | 1126 result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); |
| 1062 } | 1127 } |
| 1063 } | 1128 } |
| 1064 | 1129 |
| 1065 return result; | 1130 return result; |
| 1066 }; | 1131 }; |
| 1067 | 1132 |
| 1068 /** | 1133 /** |
| 1069 * Set the hash to a specified state, this will create an entry in the | 1134 * Set the hash to a specified state, this will create an entry in the |
| 1070 * session history so the back button cycles through hash states, which | 1135 * session history so the back button cycles through hash states, which |
| 1071 * are then picked up by our listener. | 1136 * are then picked up by our listener. |
| 1072 * @param {string} term The current search string. | 1137 * @param {string} term The current search string. |
| 1073 * @param {number} page The page currently being viewed. | 1138 * @param {number} page The page currently being viewed. |
| 1074 * @param {boolean} grouped Whether the results are grouped or not. | 1139 * @param {boolean} grouped Whether the results are grouped or not. |
| 1075 * @param {number} range The range in days to view or search over. If 0, use | 1140 * @param {number} range The range in days to view or search over. If 0, use |
| 1076 * the entire history. | 1141 * the entire history. |
| 1142 * @param {number} offset Set the begining of the query to range * offset days. | |
| 1077 */ | 1143 */ |
| 1078 PageState.prototype.setUIState = function(term, page, grouped, range) { | 1144 PageState.prototype.setUIState = function(term, page, grouped, range, offset) { |
| 1079 // Make sure the form looks pretty. | 1145 // Make sure the form looks pretty. |
| 1080 $('search-field').value = term; | 1146 $('search-field').value = term; |
| 1081 if (grouped) { | 1147 if (grouped) { |
| 1082 $('timeframe-filter').value = range; | 1148 $('timeframe-filter').value = range; |
| 1083 $('display-filter-sites').checked = true; | 1149 $('display-filter-sites').checked = true; |
| 1084 } else { | 1150 } else { |
| 1085 $('timeframe-filter').disabled = true; | 1151 $('timeframe-filter').disabled = true; |
| 1086 $('display-filter-sites').checked = false; | 1152 $('display-filter-sites').checked = false; |
| 1087 } | 1153 } |
| 1088 var hash = this.getHashData(); | 1154 var hash = this.getHashData(); |
| 1089 if (hash.q != term || hash.p != page || hash.g != grouped || | 1155 if (hash.q != term || hash.p != page || hash.g != grouped || |
| 1090 hash.r != range) { | 1156 hash.r != range || hash.o != offset) { |
| 1091 window.location.hash = PageState.getHashString( | 1157 window.location.hash = PageState.getHashString( |
| 1092 term, page, grouped, range); | 1158 term, page, grouped, range, offset); |
| 1093 } | 1159 } |
| 1094 }; | 1160 }; |
| 1095 | 1161 |
| 1096 /** | 1162 /** |
| 1097 * Static method to get the hash string for a specified state | 1163 * Static method to get the hash string for a specified state |
| 1098 * @param {string} term The current search string. | 1164 * @param {string} term The current search string. |
| 1099 * @param {number} page The page currently being viewed. | 1165 * @param {number} page The page currently being viewed. |
| 1100 * @param {boolean} grouped Whether the results are grouped or not. | 1166 * @param {boolean} grouped Whether the results are grouped or not. |
| 1101 * @param {number} range The range in days to view or search over. | 1167 * @param {number} range The range in days to view or search over. |
| 1168 * @param {number} offset Set the begining of the query to range * offset days. | |
| 1102 * @return {string} The string to be used in a hash. | 1169 * @return {string} The string to be used in a hash. |
| 1103 */ | 1170 */ |
| 1104 PageState.getHashString = function(term, page, grouped, range) { | 1171 PageState.getHashString = function(term, page, grouped, range, offset) { |
| 1105 // Omit elements that are empty. | 1172 // Omit elements that are empty. |
| 1106 var newHash = []; | 1173 var newHash = []; |
| 1107 | 1174 |
| 1108 if (term) | 1175 if (term) |
| 1109 newHash.push('q=' + encodeURIComponent(term)); | 1176 newHash.push('q=' + encodeURIComponent(term)); |
| 1110 | 1177 |
| 1111 if (page) | 1178 if (page) |
| 1112 newHash.push('p=' + page); | 1179 newHash.push('p=' + page); |
| 1113 | 1180 |
| 1114 if (grouped) | 1181 if (grouped) |
| 1115 newHash.push('g=' + grouped); | 1182 newHash.push('g=' + grouped); |
| 1116 | 1183 |
| 1117 if (range) | 1184 if (range) |
| 1118 newHash.push('r=' + range); | 1185 newHash.push('r=' + range); |
| 1119 | 1186 |
| 1187 if (offset) | |
| 1188 newHash.push('o=' + offset); | |
| 1189 | |
| 1120 return newHash.join('&'); | 1190 return newHash.join('&'); |
| 1121 }; | 1191 }; |
| 1122 | 1192 |
| 1123 /////////////////////////////////////////////////////////////////////////////// | 1193 /////////////////////////////////////////////////////////////////////////////// |
| 1124 // Document Functions: | 1194 // Document Functions: |
| 1125 /** | 1195 /** |
| 1126 * Window onload handler, sets up the page. | 1196 * Window onload handler, sets up the page. |
| 1127 */ | 1197 */ |
| 1128 function load() { | 1198 function load() { |
| 1129 uber.onContentFrameLoaded(); | 1199 uber.onContentFrameLoaded(); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1365 innerResultList.style.height = height + 'px'; | 1435 innerResultList.style.height = height + 'px'; |
| 1366 innerArrow.classList.remove('collapse'); | 1436 innerArrow.classList.remove('collapse'); |
| 1367 innerArrow.classList.add('expand'); | 1437 innerArrow.classList.add('expand'); |
| 1368 } else { | 1438 } else { |
| 1369 innerResultList.style.height = 0; | 1439 innerResultList.style.height = 0; |
| 1370 innerArrow.classList.remove('expand'); | 1440 innerArrow.classList.remove('expand'); |
| 1371 innerArrow.classList.add('collapse'); | 1441 innerArrow.classList.add('collapse'); |
| 1372 } | 1442 } |
| 1373 } | 1443 } |
| 1374 | 1444 |
| 1445 /** | |
| 1446 * Enables or disables the time range buttons. | |
| 1447 * @param {boolean} groupByDomain Whether grouping by domain is active | |
| 1448 * @param {HistoryView} view The current history view. | |
| 1449 */ | |
| 1450 function setRangeButtonsState(groupByDomain, view) { | |
| 1451 // The enabled state for the previous, today and next buttons. | |
| 1452 var buttonsState = [false, false, false]; | |
| 1453 var start = 0; | |
| 1454 var isQueryFinished = view.model_.isQueryFinished_; | |
| 1455 var offset = view.getOffset(); | |
| 1456 | |
| 1457 // Set today button. | |
| 1458 if (offset != start) { | |
| 1459 buttonsState[2] = true; | |
|
James Hawkins
2013/01/28 17:48:15
Consider creating local const vars, e.g.:
PREVIOU
Sergiu
2013/01/30 16:09:39
Changed them to local variables, initially I thoug
| |
| 1460 buttonsState[1] = true; | |
| 1461 } | |
| 1462 | |
| 1463 // TODO(sergiu): isQueryFinished does not return the correct value now but | |
| 1464 // ideally it would return false when there are no older results available. | |
| 1465 // Until then allow to go back in time as much as the user wants. | |
| 1466 // See http://crbug.com/167363. | |
| 1467 buttonsState[0] = true; | |
| 1468 | |
| 1469 $('range-previous').disabled = !(groupByDomain && buttonsState[0]); | |
| 1470 $('range-today').disabled = !(groupByDomain && buttonsState[1]); | |
| 1471 $('range-next').disabled = !(groupByDomain && buttonsState[2]); | |
| 1472 $('timeframe-filter').disabled = !groupByDomain; | |
| 1473 } | |
| 1474 | |
| 1375 /////////////////////////////////////////////////////////////////////////////// | 1475 /////////////////////////////////////////////////////////////////////////////// |
| 1376 // Chrome callbacks: | 1476 // Chrome callbacks: |
| 1377 | 1477 |
| 1378 /** | 1478 /** |
| 1379 * Our history system calls this function with results from searches. | 1479 * Our history system calls this function with results from searches. |
| 1380 * @param {Object} info An object containing information about the query. | 1480 * @param {Object} info An object containing information about the query. |
| 1381 * @param {Array} results A list of results. | 1481 * @param {Array} results A list of results. |
| 1382 */ | 1482 */ |
| 1383 function historyResult(info, results) { | 1483 function historyResult(info, results) { |
| 1384 historyModel.addResults(info, results); | 1484 historyModel.addResults(info, results); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1422 historyView.reload(); | 1522 historyView.reload(); |
| 1423 } | 1523 } |
| 1424 | 1524 |
| 1425 // Add handlers to HTML elements. | 1525 // Add handlers to HTML elements. |
| 1426 document.addEventListener('DOMContentLoaded', load); | 1526 document.addEventListener('DOMContentLoaded', load); |
| 1427 | 1527 |
| 1428 // This event lets us enable and disable menu items before the menu is shown. | 1528 // This event lets us enable and disable menu items before the menu is shown. |
| 1429 document.addEventListener('canExecute', function(e) { | 1529 document.addEventListener('canExecute', function(e) { |
| 1430 e.canExecute = true; | 1530 e.canExecute = true; |
| 1431 }); | 1531 }); |
| OLD | NEW |