<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Firefox - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Firefox - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 22:38:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/firefox/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ What are Bookmarklets? How to Use JavaScript to Make a Bookmarklet in Chromium and Firefox ]]>
                </title>
                <description>
                    <![CDATA[ Bookmarklets are browser bookmarks that execute JavaScript instead of opening a webpage. They're also known as bookmark applets, favlets, or JavaScript bookmarks. Bookmarklets are natively available in all major browsers, including Mozilla Firefox an... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-are-bookmarklets/</link>
                <guid isPermaLink="false">66d460fa47a8245f78752ac7</guid>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Google Chrome ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firefox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Seth Falco ]]>
                </dc:creator>
                <pubDate>Thu, 17 Jun 2021 00:53:04 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/06/cover-defectivefox-o-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><a target="_blank" href="https://en.wikipedia.org/wiki/Bookmarklet">Bookmarklets</a> are browser bookmarks that execute JavaScript instead of opening a webpage. They're also known as bookmark applets, favlets, or JavaScript bookmarks.</p>
<p>Bookmarklets are natively available in all major browsers, including Mozilla Firefox and Chromium-based browsers like Chrome or Brave.</p>
<h2 id="heading-scripting-with-javascript">Scripting with JavaScript</h2>
<p>Learning how to write scripts provides many benefits, namely the huge time-savings from automating repetitive or tedious tasks.</p>
<p>If you aren't a developer, the idea of learning to code might be intimidating, however scripting doesn't require software engineering knowledge or design patterns. The goal isn't to make scalable software, but rather to automate specialized or trivial tasks.</p>
<p>Regardless of profession, even if you've never written code before, consider what you do in your browser. If you ever feel what you do is repetitive or robotic, consider the possibility of delegating the task to an actual robot.</p>
<h2 id="heading-use-cases-for-bookmarklets">Use Cases for Bookmarklets</h2>
<p>With bookmarklets, you can manipulate the current page as the function will have the context of the current tab. This means you can:</p>
<ul>
<li><p>Click buttons virtually</p>
</li>
<li><p>Modify the content</p>
</li>
<li><p>Use the content of the page to open a new page</p>
</li>
<li><p>Remove elements from the page</p>
</li>
</ul>
<p>You can also make bookmarks that don't utilize the context at all, such as conditionally opening a URL, or generating HTML for a new tab.</p>
<p>You'll find some bookmarklets I made for this article in <a class="post-section-overview" href="#heading-example-bookmarklets">Example Bookmarklets</a>. They're just for demonstration, but should make the capabilities and implementations apparent.</p>
<h2 id="heading-how-to-create-bookmarklets">How to Create Bookmarklets</h2>
<p>Creating a bookmarklet is almost identical to creating a regular bookmark. The only difference is that you'll write JavaScript in the URL field instead of an HTTP/HTTPS URL.</p>
<h3 id="heading-navigate-to-the-bookmark-menu">Navigate to the Bookmark Menu</h3>
<h4 id="heading-mozilla-firefox">Mozilla Firefox</h4>
<p>Either in your bookmarks bar, or in the Bookmarks sidebar (<code>CTRL</code> + <code>B</code>), you can right-click, then click "Add Bookmark...":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/firefox-1.png" alt="The &quot;Add bookmark&quot; modal when creating a new bookmark in Firefox." width="600" height="400" loading="lazy"></p>
<h4 id="heading-chromium">Chromium</h4>
<p>You can right-click your bookmarks bar, then click "Add page...". Alternatively, you can go to your Bookmarks manager, then right-click and click "Add new bookmark":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/chromium.png" alt="The &quot;Edit bookmark&quot; modal when creating a new bookmark in Chromium." width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-write-a-bookmarklet">How to Write a Bookmarklet</h2>
<p>In the URL field of the bookmark modal, write a JavaScript function in the following format.</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-comment">// Your code here!</span>
})();
</code></pre>
<p><code>javascript:</code> is the URL's protocol. This indicates that the browser should execute the bookmark as JavaScript.</p>
<p><code>(() =&gt; { })</code> defines an anonymous function (lambda). You should write the code you want to execute between the curly braces.</p>
<p><code>();</code> will execute the anonymous function you just created.</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  alert(<span class="hljs-string">'Hello, World!'</span>);
})();
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/image-147-1.png" alt="A browser alert with the message: &quot;Hello, World!&quot;" width="600" height="400" loading="lazy"></p>
<p>You can also make it generate HTML and open it as an HTML document:</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> <span class="hljs-string">'&lt;h1 style="color: white; background-color: black;"&gt;Hello, World!&lt;/h1&gt;'</span>;
})();
</code></pre>
<h3 id="heading-spacing-for-bookmarklets">Spacing for Bookmarklets</h3>
<p>Most browsers don't allow a multiline input field in the bookmark URL, so you'll usually have to make strict use of curly braces (<code>{</code> and <code>}</code>) and semi-colons (<code>;</code>) when writing bookmarklets. This is especially important when scoping conditional constructs (<code>if</code>/<code>for</code>/<code>while</code>).</p>
<p>Other than this, spacing doesn't matter. Don't be afraid to have a lot of code in one line because that's all you've got:</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {   <span class="hljs-keyword">const</span> documentHTML = <span class="hljs-built_in">document</span>.documentElement.outerHTML;   <span class="hljs-keyword">const</span> matches = documentHTML.matchAll(<span class="hljs-regexp">/[\w.+=~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*/g</span>);   <span class="hljs-keyword">const</span> flatMatches = <span class="hljs-built_in">Array</span>.from(matches).map(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> item[<span class="hljs-number">0</span>]);   <span class="hljs-keyword">const</span> uniqueMatches = <span class="hljs-built_in">Array</span>.from(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(flatMatches));      <span class="hljs-keyword">if</span> (uniqueMatches.length &gt; <span class="hljs-number">0</span>) {     <span class="hljs-keyword">const</span> result = uniqueMatches.join(<span class="hljs-string">'\n'</span>);     alert(result);   } <span class="hljs-keyword">else</span> {     alert(<span class="hljs-string">'No emails found!'</span>);   } })();
</code></pre>
<p>If your script is complex, it'll be easier to maintain your bookmarklet in a code editor like <a target="_blank" href="https://code.visualstudio.com/">Visual Studio Code</a>. You can copy and paste it over to your browser when it's ready.</p>
<h3 id="heading-how-to-interact-with-websites">How to Interact with Websites</h3>
<p>The most common thing you'd do with bookmarklets is manipulating or interacting with websites you have open.</p>
<h4 id="heading-the-global-document-object">The Global Document Object</h4>
<p>As the bookmarklet has the context of the page you're on, you have access to the <code>[document](https://developer.mozilla.org/en-US/docs/Web/API/Document)</code> object.</p>
<p>The ideal functions for selecting elements for our use case are:</p>
<ul>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector"><code>querySelector</code></a> to select a single element by CSS selector.</p>
</li>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll"><code>querySelectorAll</code></a> to select all matching elements by CSS selector.</p>
</li>
<li><p><code>[evaluate](https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate)</code> to select all matching elements by XPath.</p>
</li>
</ul>
<p>There are other functions like <code>[getElementById](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById)</code> and <code>[getElementsByClassName](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName)</code>, but we want to avoid false-positives, so we'll always make a strict selection using multiple element attributes.</p>
<h4 id="heading-css-selectors-and-xpath">CSS Selectors and XPath</h4>
<p>If you're only selecting elements based on element names, IDs, classes, and other attributes, using a CSS selector will be simple and efficient.</p>
<p>CSS selectors are used to select elements in HTML documents to apply styles. If you're familiar with web development or CSS in general, then you already know how to use CSS selectors. (More Info: <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors">MDN</a>, <a target="_blank" href="https://www.freecodecamp.org/news/css-selectors-cheat-sheet/">freeCodeCamp</a>)</p>
<p>If you need to match the text content of an element as well, then you'll have to use XPath instead.</p>
<p>XPath is used to traverse XML documents, it provides all the capabilities of CSS selectors and more, including comparing the content of elements or using a regular expression to match it. (More Info: <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/XPath">MDN</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/XPath">Wikipedia</a>)</p>
<h4 id="heading-how-to-select-elements-from-the-webpage">How to Select Elements from the Webpage</h4>
<p>One of the most common uses for bookmarklets is manipulating webpages. To interact with, manipulate, or remove elements from the page, you'll always have to select the elements first.</p>
<ol>
<li><p>First open the browser development tools by pressing <code>F12</code>, or <code>CTRL</code> + <code>SHIFT</code> + <code>I</code>.</p>
</li>
<li><p>Click the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector">Inspector</a>/<a target="_blank" href="https://developer.chrome.com/docs/devtools/dom/">Elements</a> tab, which displays the full HTML document of the page you have open.</p>
</li>
<li><p>Use the element selector tool (<code>CTRL</code> + <code>SHIFT</code> + <code>C</code>) and click on the element you want to interact with. The document viewer will scroll to the element you clicked in the HTML document. You'll see the element ID, classes, and attributes.</p>
</li>
<li><p>Check if you're on the correct element. Elements can be nested where it's easier to navigate to it manually in the HTML. For example, you may have clicked an <code>svg</code> element, but actually needed the <code>button</code> or <code>div</code> it was inside of.</p>
</li>
<li><p>Define a CSS selector or XPath that matches everything you want, you might want to make it more strict than necessary to avoid potential false-positives.</p>
</li>
</ol>
<p>For example, suppose I wanted to dismiss all topic suggestions on Twitter because they're annoying. Here is how a clickable element to dismiss a topic looks like.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Screen-Shot-2021-06-16-at-04.19.17.png" alt="Twitter topic suggestions, with an X button to mark it as &quot;Not interested&quot;." width="600" height="400" loading="lazy"></p>
<p><em>Twitter topic suggestions, with an X button to mark it as "Not interested".</em></p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"Dismiss"</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">tabindex</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"..."</span>&gt;</span>
  <span class="hljs-comment">&lt;!-- The parent div element has the click listener. --&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"..."</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">svg</span> <span class="hljs-attr">viewBox</span>=<span class="hljs-string">"0 0 24 24"</span> <span class="hljs-attr">aria-hidden</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"..."</span>&gt;</span>
      <span class="hljs-comment">&lt;!-- The actual X icon. --&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">svg</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>An appropriate selector is <code>div[aria-label=Dismiss][role=button]</code>.</p>
<p>We need to use the <code>querySelectorAll</code> function from <a class="post-section-overview" href="#heading-the-global-document-object">The Global Document Object</a>, then call the <code>[click](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click)</code> method to simulate a click.</p>
<p>A bookmarklet can be implemented to select every dismiss button, and trigger a click event to all of them with a 250ms interval.</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> selector = <span class="hljs-string">'div[aria-label=Dismiss][role=button]'</span>;
  <span class="hljs-keyword">const</span> topics = <span class="hljs-built_in">document</span>.querySelectorAll(selector);

  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; topics.length; i++) {
    <span class="hljs-keyword">let</span> topic = topics[i];
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> topic.click(), i * <span class="hljs-number">250</span>);
  }
})();
</code></pre>
<h2 id="heading-how-to-redistribute-bookmarklets">How to Redistribute Bookmarklets</h2>
<p>To "install" a bookmarklet, users create a bookmark on their browser and copy and paste the code to it.</p>
<p>This can be inconvenient, so it's common to link bookmarklets when sharing. This is as simple as putting it in the <code>href</code> attribute of your link anchor.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"javascript: (() =&gt; {   alert('Hello, World!'); })();"</span>&gt;</span>
  Hello, World!
<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre>
<p>Now users can right-click and "Bookmark Link", or drag it to the bookmarks bar for easy access.</p>
<p>Clicking the link on the web page will execute the script immediately. Ensure it's not going to obstruct what a user is trying to achieve on your site if they accidentally click it.</p>
<p>For example, the following link will display an alert with "Hello, World!".</p>
<h3 id="heading-user-content-and-content-security-policy-bypass">User Content and Content Security Policy Bypass</h3>
<p>If you run a service that allows user-generated content to contain custom HTML, it's important to sanitize link anchors (<code>a</code>).</p>
<p>The bookmarklet is executing like code in the developer tools console, and bypasses the configured <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP">Content Security Policy</a> (CSP).</p>
<p>The "Hello, World!" link can just as easily send data to another server, including the input of form fields, or cookies.</p>
<p>As a service provider, it's important to be wary that users can exploit this to share malicious code on your platform. If their link anchor is running on a page under your domain, it can access sensitive information on the page and <code>[document.cookies](https://developer.mozilla.org/en-US/docs/web/api/document/cookie)</code>.</p>
<p>You can try it yourself in a sandbox environment:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"javascript: (() =&gt; {   alert(document.cookie); })();"</span>&gt;</span>
  EvilScript
<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre>
<h3 id="heading-only-run-code-you-trust">Only Run Code You Trust</h3>
<p>As a user, it's important to note that any code can be malicious, only click or add bookmarklets where at least one of the following are true:</p>
<ul>
<li><p>It came from a reputable source.</p>
</li>
<li><p>You know JavaScript, and you reviewed what it does.</p>
</li>
<li><p>Someone you trust knows JavaScript, and they reviewed it for you.</p>
</li>
</ul>
<h2 id="heading-privacy-and-security">Privacy and Security</h2>
<p>Bookmarklets can be handy, but we also have <a target="_blank" href="https://en.wikipedia.org/wiki/Browser_extension">web extensions</a> and <a target="_blank" href="https://en.wikipedia.org/wiki/Userscript">user scripts</a> too. What makes them different?</p>
<p>Web extensions are incredibly user-friendly and flexible. Bookmarklets can't block network requests, update content as the page changes, or manage tabs.</p>
<p>However, there're some benefits to using bookmarklets over anything else, namely for privacy and security.</p>
<p>An extension that modifies the font on all pages must get permission to access all data on all web pages. On Firefox and Chrome, this includes all input and password fields. (More Info: <a target="_blank" href="https://support.mozilla.org/kb/permission-request-messages-firefox-extensions#w_access-your-data-for-all-websites">Mozilla</a>, <a target="_blank" href="https://developer.chrome.com/docs/extensions/mv3/permission_warnings/#permissions_with_warnings">Google</a>)</p>
<p>In contrast, a bookmarklet only has access to the page for the very moment it's executing, and only when manually triggered by the user.</p>
<p>This results in less risk of malware, a rogue employee can't push a malicious update, and data won't silently get sent to other servers.</p>
<p>The Chrome Web Store has previously had several malicious extensions which had to be taken down. Some of which had millions of installations before being removed. (<a target="_blank" href="https://en.wikipedia.org/wiki/Chrome_Web_Store#Malware">More Info</a>)</p>
<h2 id="heading-example-bookmarklets">Example Bookmarklets</h2>
<p>Here's a list of bookmarklet ideas, along with the code that implements it. You can copy and paste them into new bookmarks to try them out.</p>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> documentHTML = <span class="hljs-built_in">document</span>.documentElement.outerHTML;
  <span class="hljs-keyword">const</span> matches = documentHTML.matchAll(<span class="hljs-regexp">/[\w.+=~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*/g</span>);
  <span class="hljs-keyword">const</span> flatMatches = <span class="hljs-built_in">Array</span>.from(matches).map(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> item[<span class="hljs-number">0</span>]);
  <span class="hljs-keyword">const</span> uniqueMatches = <span class="hljs-built_in">Array</span>.from(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(flatMatches));

  <span class="hljs-keyword">if</span> (uniqueMatches.length &gt; <span class="hljs-number">0</span>) {
    <span class="hljs-keyword">const</span> result = uniqueMatches.join(<span class="hljs-string">'\n'</span>);
    alert(result);
  } <span class="hljs-keyword">else</span> {
    alert(<span class="hljs-string">'No emails found!'</span>);
  }
})();
</code></pre>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> xpath = <span class="hljs-string">"//a [contains(., 'Jobs') or contains(., 'Careers') or contains(., 'Hiring')]"</span>;
  <span class="hljs-keyword">const</span> elements = <span class="hljs-built_in">document</span>.evaluate(xpath, <span class="hljs-built_in">document</span>);
  <span class="hljs-keyword">const</span> element = elements.iterateNext();

  <span class="hljs-keyword">if</span> (element) {
    element.click();
  } <span class="hljs-keyword">else</span> {
    alert(<span class="hljs-string">'No links for jobs found!'</span>);
  }
})();
</code></pre>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> allElements = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">'*'</span>);

  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> element <span class="hljs-keyword">of</span> allElements) {
    element.style.fontFamily = <span class="hljs-string">'Comic Sans MS'</span>;
  }
})();
</code></pre>
<pre><code class="lang-js">javascript: (<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> destination = <span class="hljs-string">"https://www.freecodecamp.org/"</span>;
  <span class="hljs-keyword">const</span> alternate = <span class="hljs-string">"https://tenor.com/Y6jj.gif"</span>;

  <span class="hljs-keyword">const</span> date = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
  <span class="hljs-keyword">const</span> hours = date.getHours();

  <span class="hljs-keyword">if</span> (hours &lt; <span class="hljs-number">3</span> || hours &gt;= <span class="hljs-number">6</span>) {
    <span class="hljs-built_in">window</span>.open(destination);
  } <span class="hljs-keyword">else</span> {
    <span class="hljs-built_in">window</span>.open(alternate);
  }
})();
</code></pre>
<p>Thank you for reading! Now go forth and create your own bookmarklets.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Clear Your Browser History - Delete Your Browsing History in Chrome, Firefox, and Safari ]]>
                </title>
                <description>
                    <![CDATA[ Have you ever tried to view your browsing history? Maybe you want to check that restaurant you looked up last night (but forgot its name), or you want to revisit a travel site you browsed a couple days ago. It can be super useful. But, on the other h... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/clear-history-how-to-delete-your-browsing-history-in-chrome-firefox-and-safari/</link>
                <guid isPermaLink="false">66b1fa0e7dd34c3b72fe22d5</guid>
                
                    <category>
                        <![CDATA[ Browsers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Google Chrome ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firefox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ privacy ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abigail Rennemeyer ]]>
                </dc:creator>
                <pubDate>Fri, 20 Dec 2019 21:22:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9e94740569d1a4ca3dde.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Have you ever tried to view your browsing history? Maybe you want to check that restaurant you looked up last night (but forgot its name), or you want to revisit a travel site you browsed a couple days ago. It can be super useful.</p>
<p>But, on the other hand, what if you don't want a record of sites you've visited left on your computer? Perhaps your spouse or partner will discover you've been searching for their birthday gift (last minute, too!), or you've visited a site that you'd rather keep private and personal.</p>
<p>You could also be using a public computer, and just don't want strangers viewing your history. Fair enough.</p>
<p>Whatever the reason, it's a good idea to know how to view - and clear, or delete - your browsing history. And it's pretty easy to do so in various different browsers. So let's have a look.</p>
<h2 id="heading-how-to-clear-your-history-in-chrome">How to clear your history in Chrome</h2>
<p>Chrome stores the sites you've visited over the last 90 days in your browsing history. If you're using incognito mode (which you can read more about here) it won't store those sites. But anything you browsed in a regular Chrome browser will appear there.</p>
<p>Also, <strong>something to note</strong>: if you've synced up all your devices (laptop, iPhone, tablet, and so on), that history will be visible across all devices. Likewise, when you clear it, it will be cleared from all of the devices.</p>
<h3 id="heading-clearing-all-your-browsing-history">Clearing all your browsing history</h3>
<p>On your computer, open the Chrome browser. In the upper right corner, you'll see three vertical dots. Click them to open that menu, and select the "History" tab from the options there.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/Chrome-browsing-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>How to get to your browsing history in Chrome</em></p>
<p>Once you click that option, you'll be brought to a summary of your recent browsing history. If you just want to check it out, great.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/chrome-history-list.png" alt="Image" width="600" height="400" loading="lazy">
<em>Your browsing history ready for your viewing (or deleting) pleasure.</em></p>
<p>If you want to clear it, just click the "Clear browsing data" tab on the left. You'll be brought to this screen (below), where you have the option to clear the data for the last hour, 24 hours, 7 days, 4 weeks, or all time. Choose your time frame, and the categories you'd like to clear:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/chrome-browsing-history-clear-data.png" alt="Image" width="600" height="400" loading="lazy">
<em>Click the dropdown ("Time range") to choose your time frame. Check and uncheck boxes depending on your needs.</em></p>
<p>As you can see from the screenshot above, Chrome stores not only your browsing history, but also cookies from sites you visit and cached files.</p>
<p>Once you clear that data, it won't show up in your history. Chrome also won't autocomplete those sites for you if you start typing them in the address bar.</p>
<h3 id="heading-clearing-part-of-your-history">Clearing part of your history</h3>
<p>What if you just want to clear a few sites, but want to keep the rest? That's possible, too.</p>
<p>Open Chrome, click on those three vertical dots, choose "History". Same process so far. Now, on that first page of history, instead of clicking "Clear browsing data" on the left, just select/check boxes for what you want to delete:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/chrome-clear-specific-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>Just select the sites you'd like to delete.</em></p>
<p>Once you've selected all the sites you'd like to clear, just click "Delete" in the upper right corner. Only those sites will be removed from your history.</p>
<h2 id="heading-how-to-clear-your-history-in-firefox">How to clear your history in Firefox</h2>
<p>To clear your history in Firefox, the process is fairly similar to Chrome - the buttons just look a little different.</p>
<h3 id="heading-clearing-all-browsing-history">Clearing all browsing history</h3>
<p>Open your Firefox browser, and click the library tab at the upper right (it looks like a few books leaning together):</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/firefox-history-2.png" alt="Image" width="600" height="400" loading="lazy">
<em>Once you select "History", a new window will open up in the same spot.</em></p>
<p>Select the "History" tab, then the "Clear recent history" option from the menu that will replace the previous one.</p>
<p>You'll see this box pop up:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/firefox-clear-history-tab.png" alt="Image" width="600" height="400" loading="lazy">
<em>Be ready to delete it all!</em></p>
<p>And you'll notice that there's a "Time range to clear" dropdown. You can clear your history from the last hour, two hours, four hours, today, or all time.</p>
<p>You can also select what information you'd like to clear, similar to Chrome. </p>
<p>Now, be prepared: if you just select "Clear Now" at the bottom right, it'll clear all your history, no questions asked.</p>
<h3 id="heading-clearing-part-of-your-history-1">Clearing part of your history</h3>
<p>If you'd like to select which bits to clear, the process is a bit different. Click that same library tab, select "History" and then "Show all history" down at the bottom.</p>
<p>This box will pop up:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/firefox-show-all-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>You can select what history you'd like to see (today, yesterday, and so on) via the left side bar.</em></p>
<p>Then you'll see your history. If you only have a few sites there, you can just ctrl click (or right click) on the site you want to delete. </p>
<p>When you hold down the ctrl key and click on the site, a menu will pop up. Just select "forget about this site" from that menu and Firefox will delete it from your history.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/firefox-forget-site.png" alt="Image" width="600" height="400" loading="lazy">
<em>Ctrl+click (or right click) to select a site. One at a time.</em></p>
<p>All history associated with that site (cookies, cache, browsing and logins, and so on) will be removed. Hooray!</p>
<h2 id="heading-how-to-clear-your-history-in-safari">How to clear your history in Safari</h2>
<p>Last but not least, let's see how to clear your history in Safari.</p>
<h3 id="heading-clearing-all-of-your-browsing-history">Clearing all of your browsing history</h3>
<p>Once again, the process is fairly similar to Chrome and Firefox. But in Safari, you just click the "History" tab at the top of your browser menu. From the dropdown, select "Clear History":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/Safari-clear-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>Easy as pie - just click the "History" tab and then "Clear history".</em></p>
<p>A box will pop up that will ask you whether you'd like to clear all your history (which includes caches, etc) and for what time frame (last hour, today, today and yesterday, all history).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/Safari-clear-all.png" alt="Image" width="600" height="400" loading="lazy">
<em>Similar options.</em></p>
<p>Select the appropriate option, and click "Clear History". Boom, history cleared for that period of time (or all time).</p>
<h3 id="heading-clearing-part-of-your-history-2">Clearing part of your history</h3>
<p>Again, you might not want to clear everything. Just one site. Totally doable.</p>
<p>Click the "History" tab and select "Show all history" at the top of the dropdown. All the sites you've browsed will be listed by day. </p>
<p>If you want to choose one specific site to delete, just ctrl click (or right click) on that site, and select "Delete" from the drop down:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/10/safari-select-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>Similar to Firefox - ctrl+click or right click to select sites to delete.</em></p>
<p>Just that site will be deleted from your browsing history.</p>
<p>Now you know how to delete your browsing history - all or part of it - from some of the major browsers in use today.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to see your React state & props in the browser ]]>
                </title>
                <description>
                    <![CDATA[ By Andrew Bales If you’re building a web app with React, you may want to see the state or props of components in real-time. Here’s a quick solution for Chrome & FireFox! React Developer Tools Install the React Developer Tools extension for Chrome or ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-see-your-react-state-props-in-the-browser-774098a50fcc/</link>
                <guid isPermaLink="false">66c3545ce9dd11e06f605bbc</guid>
                
                    <category>
                        <![CDATA[ Google Chrome ]]>
                    </category>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firefox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2019 21:40:41 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*QeEbGcmtoQ3T_zUdpG8TZw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Andrew Bales</p>
<p>If you’re building a web app with React, you may want to see the state or props of components in real-time. Here’s a quick solution for Chrome &amp; FireFox!</p>
<h3 id="heading-react-developer-tools">React Developer Tools</h3>
<p>Install the React Developer Tools extension for <a target="_blank" href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">Chrome</a> or <a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/react-devtools/">FireFox</a>. It allows you to inspect React component hierarchies within the developer tools — the same way you would peek at the DOM elements, console, or network.</p>
<h3 id="heading-inspecting-react-components">Inspecting React Components</h3>
<ol>
<li>Open your app and inspect the page with developer tools (Command+Option+I).</li>
<li>Select the React Developer Tools</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/nRV4nSI2fdxIBQyhGSDu69Vz83ruxGJHk3tL" alt="Image" width="800" height="387" loading="lazy"></p>
<ol start="3">
<li>Pick a component in the tree to see its state and current props.</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Wo9vvCc3YMSTCGv2R55u87Ttgi8mLdGdBR1E" alt="Image" width="893" height="499" loading="lazy"></p>
<p>You can also select a React element directly from the page by hovering over it with the selection tool:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-uN55RQ0UWYdHrjJ0quyPHmAEY5dlpumQlzF" alt="Image" width="48" height="38" loading="lazy">
<em>Selection tool menu icon in developer tools</em></p>
<h3 id="heading-modifying-the-state">Modifying the State</h3>
<p>If you want to update your state in the browser— you can! Modify it by clicking and editing state attributes in the React tab. This will re-render the DOM, passing the state down through the props.</p>
<p>Happy coding! ?</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How Mozilla takes care of Firefox’s health — and what you can learn from it ]]>
                </title>
                <description>
                    <![CDATA[ By Syeda Aimen Batool Currently, I’m working on a Firefox health dashboard as a part of my Outreachy internship with Mozilla. And here are the major goals we intend to achieve during the internship. Add new features to the graphical presentation of ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/here-is-how-we-take-care-of-firefox-health-at-mozilla-8f7f9b085955/</link>
                <guid isPermaLink="false">66c34c58a7aea9fc97bdfb48</guid>
                
                    <category>
                        <![CDATA[ Firefox ]]>
                    </category>
                
                    <category>
                        <![CDATA[ internships ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Mozilla ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 24 Jan 2019 21:55:03 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*3orZX4NPEQbwNxUgz7Wm4Q.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Syeda Aimen Batool</p>
<p>Currently, I’m working on a <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard">Firefox health dashboard</a> as a part of my <a target="_blank" href="https://medium.freecodecamp.org/how-i-got-a-remote-paid-internship-at-mozilla-through-outreachy-60958fe9264a">Outreachy internship with Mozilla</a>. And here are the <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard/projects/2">major goals</a> we intend to achieve during the internship.</p>
<ul>
<li>Add new features to the graphical presentation of performance data</li>
<li>Transfer existing JS Team (Firefox Performance) dashboard to the health dashboard</li>
<li>Enhance existing information on charts and fix some bugs</li>
</ul>
<p>The main purpose of this post is to explain the project to someone who is not in the community and not familiar with the stuff we are doing at Mozilla. The intention is to help newbies and other contributors to understand the dashboard so they can contribute to this opensource project with more sense of what is going on inside.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Amkrf0TIX5AYgBBaD9bSbFGQg0eL7mVGCdrr" alt="Image" width="800" height="502" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/photos/0-SGyQFiDRI?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener" target="_blank" title=""&gt;rawpixel on &lt;a href="https://unsplash.com/search/photos/health?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-what-is-firefox-health-dashboard">What is Firefox Health Dashboard?</h3>
<p>Firefox health is a project to create dashboards for project managers and engineers. It displays Firefox matrics and insights to help meet release criteria. It allows including data/metrics from Mozilla’s issue tracker (Bugzilla), performance data (Perfherder), product metrics (Telemetry) and few more sources. All data is displayed in the form of graphs using an open source graphing library ChartJS to display insights against different dates and platforms.</p>
<p>It was previously known as Platform Health. It was <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard/issues/29">refactored in Jan 2018</a> as Firefox Health Dashboard. One of the major changes in this refactorization was to separate backend from the front-end. This improved code maintainability.</p>
<h4 id="heading-technologies">Technologies:</h4>
<p>The <a target="_blank" href="https://github.com/mozilla/firefox-health-backend">backend</a> is written using NodeJS and Koa. The <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard">front-end</a> is built using ReactJS along with an open source graphing library ChartJS. Some of the data is coming from different hosts through different libraries. For example, perf-google is querying Mozilla’s Perfherder for performance data. Information about the reported bug is coming from Bugzilla. So if you are planning to contribute sometime in the future, you need to have an understanding of the technologies mentioned above.</p>
<p>This dashboard caters to performance of different Firefox versions and devices. But today we are going to talk about <a target="_blank" href="https://health.graphics/android">Firefox android</a> and how engineers at Mozilla take care of its performance.</p>
<h3 id="heading-datametrics-for-firefox-android">Data/metrics for Firefox android</h3>
<p>Currently, data for Firefox android is coming from different sources. We display the data in the form of graphs for better understanding and analysis. You can see all insights to <a target="_blank" href="https://health.graphics/android">Firefox android on the health dashboard</a>. Here are some sources and information about Firefox android to help engineers improve the performance of the browser.</p>
<h4 id="heading-bugzilla">Bugzilla:</h4>
<p>Developed by Mozilla, Bugzilla is a free, open-source tool for tracking bugs, issues and change requests in large complex applications. It is used by thousands of organizations to keep track of their product performance. We are using it in the Health Dashboard to keep an eye on the bugs popping up in Firefox Android.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/dKEOkAJGbvDDvS3M-pUPMS8GvHtasek7oJ1D" alt="Image" width="800" height="350" loading="lazy">
<em>A graph displaying bugs from Bugzilla</em></p>
<p>As mentioned above, we are using ChartJS to display data. Here we have a graph representing the number of bugs reported on different dates for Firefox Android at Bugzilla. Bugs with P1 label have the highest priority. They need to be fixed as soon as possible. Then comes P2 bugs with the 2nd highest priority. P3 level bugs are with lowest priority and engineers can fix them whenever they have time. This helps developers and product managers to review bugs of different priorities more effectively and solve them according to the priority.</p>
<h4 id="heading-nimbledroid">NimbleDroid:</h4>
<p>We are using a third party service called NimbleDroid to get some data insights after running the tests against Firefox Android. NimbleDroid is a functional performance testing service for android and IOS devices.</p>
<blockquote>
<p>Monitor every critical user flow for every build of your mobile app. Pinpoint issues that degrade user experience early in the dev cycle. Seamlessly integrate with your CI workflow. — Official Site</p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/QtqHkLwQwTP0szF2tkiNZyvA-HWLQ1Sl7jkP" alt="Image" width="800" height="471" loading="lazy">
<em>Showing data insights given by Nimbledroid</em></p>
<h4 id="heading-telemetry">Telemetry:</h4>
<p>Telemetry is a tool that has the capability to provide performance and usage information to Mozilla to help engineers and decision makers to measure the performance of Firefox in the real world. It has the ability to collect performance, hardware, usage, customization, and other non-personal information from the user of Firefox and send it to Mozilla on daily bases to help engineers improve the quality and efficiency of the browser.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xshtOGlnr9LFHhteDt7yxJFkOif5bD80akVO" alt="Image" width="800" height="305" loading="lazy">
<em>Telemetry graph view</em></p>
<p>For an Android device, the browser measures the time taken by it to load a content page on a device and reports it back through Telemetry. We then display it in graphical form. For instance, the screenshot says 75% of the users reported a total content page load time of 4.9 seconds on Sep 19, 2018. And this data is gathered from different devices from different users. This helps the engineers to keep an eye on loading time of the browser to improve its speed and make it more efficient.</p>
<h4 id="heading-perfherder">Perfherder:</h4>
<p>Perfherder is a system to help engineers visualize and analyze the performance data produced by the many automated tests run against Mozilla products such as Firefox or Firefox Android. Perfherder is a part of Treeherder project. It is another dashboard for check-ins to Mozilla’s projects. The main goal of this tool is to make sure that the performance of the Firefox gets better over the time. It assists developers in the understanding of their changes and potential fixes by reporting regressions.</p>
<p>In the coming articles, we will talk about Firefox Quantum and JS team dashboard. We will see how these tools are working to improve the performance of the Firefox browser.</p>
<h4 id="heading-contribution-guide">Contribution guide:</h4>
<p>If you care about the health of Firefox or interested in contributing to the project, then here is the way.</p>
<ul>
<li>Clone and set up the <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard">project</a> on your local machine</li>
<li>Follow the <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard#firefox-health-dashboard">readme</a></li>
<li>And start with <a target="_blank" href="https://github.com/mozilla-frontend-infra/firefox-health-dashboard/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22">good-first-issues</a> if you are finding it overwhelming to start</li>
</ul>
<p>Stay tuned to know more about the awesomeness we are doing at Mozilla.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
