Brave Infinite Scroll

Enables infinite scroll on Brave Search

  1. // ==UserScript==
  2. // @name Brave Infinite Scroll
  3. // @description Enables infinite scroll on Brave Search
  4. // @match *://search.brave.com/search*
  5. // @run-at document-end
  6. // @version 0.0.1.20250309090434
  7. // @namespace https://greasyfork.org/users/1435046
  8. // ==/UserScript==
  9.  
  10. let pageNumber = 1;
  11. let isLoading = false;
  12. let hasMore = true;
  13.  
  14. const fetchNextPage = async () => {
  15. const baseUrl = new URL(window.location.href);
  16. baseUrl.searchParams.set('offset', pageNumber);
  17. try {
  18. const response = await fetch(baseUrl.toString());
  19. const text = await response.text();
  20. const newDoc = new DOMParser().parseFromString(text, 'text/html');
  21.  
  22. // Create container for new results
  23. const container = document.createElement('div');
  24. container.id = `page-${pageNumber}`;
  25. container.style.marginTop = '20px';
  26.  
  27. // Add new results (adjust selector based on Brave's structure)
  28. newDoc.querySelectorAll('#results > .snippet').forEach(result => {
  29. container.appendChild(result.cloneNode(true));
  30. });
  31.  
  32. // Find insertion point (before pagination element)
  33. const insertionPoint = document.querySelector('#pagination-snippet') ||
  34. document.querySelector('#results').lastElementChild;
  35.  
  36. if (insertionPoint) {
  37. insertionPoint.before(container);
  38. }
  39.  
  40. // Check for more pages (look for Next button)
  41. hasMore = !!newDoc.querySelector('a[href*="offset="]:not([disabled])');
  42. if (hasMore) pageNumber++;
  43. } catch (error) {
  44. console.error('Error fetching next page:', error);
  45. hasMore = false;
  46. }
  47. };
  48.  
  49. window.addEventListener('scroll', async () => {
  50. const scrollThreshold = 1000;
  51. const scrollPosition = window.innerHeight + window.scrollY;
  52. const scrollMax = document.documentElement.scrollHeight - scrollThreshold;
  53.  
  54. if (!isLoading && hasMore && scrollPosition >= scrollMax) {
  55. isLoading = true;
  56. await fetchNextPage();
  57. isLoading = false;
  58. }
  59. });