LogoLogo
Developer HubGitHubContact Us
  • Welcome!
  • Olive Helps
    • Platform
      • How Olive Helps Works
      • Installation
      • Account Creation
      • Distributing Olive Helps
    • FAQs
      • General Loop FAQs
      • Loop Development FAQs
      • Olive Helps User FAQs
      • Security / IT FAQs
    • Data Security
      • User Data
      • Antivirus and Firewalls
  • Loop Development Kit
    • Your First Loop
      • Become a Loop Author
      • Creating a Loop
      • Build Your Loop
      • Local Loop Installation
      • Restarting Local Loops
    • Troubleshooting
    • Loop Security
      • Permissions
      • Environment Permissions
    • Loop Publication
      • Loop Approval Checklist
    • Loop Analytics Library
    • Examples
  • Documentation
  • Interfaces
  • Type Alias
  • Enumerations
  • Whisper Components
    • Base Attributes
    • Autocomplete
    • Box
    • Breadcrumb
    • Button
    • Chart
    • CollapseBox
    • Grid
    • Checkbox
    • Date Time
    • Divider
    • DropZone
    • Email
    • Icon
    • List Pair
    • Link
    • Pagination
    • Number
    • Markdown
    • Message
    • Password
    • Progress
    • Radio
    • Rating
    • RichTextEditor
    • Section Title
    • Select
    • Text Input
    • Telephone
    • Typography
  • APTITUDES
    • What are Aptitudes?
    • Browser
    • Clipboard
    • Config
    • Cursor
      • Screen Scaling Behavior
    • Document
    • Filesystem
    • Keyboard
    • Network
    • Process
    • Screen
    • Search
      • Index
    • System
    • UI
      • Loop UI Handlers
    • User
      • JWT
    • Vault
    • Whisper
      • Whisper Updates
      • JSX Whispers
    • Window
      • Screen Scaling Behavior
  • Release Notes
    • What's New
      • Olive Helps v0.55.0
      • Olive Helps v0.54.1
      • Olive Helps v0.53.1
      • Olive Helps v0.51.2
      • LDK v4.0.0
      • Olive Helps v0.50.3
      • Olive Helps v0.49.5
      • LDK v 3.18.0
      • Olive Helps v0.47.2
      • Olive Helps v0.46.2
      • LDK v 3.17.0
      • Olive Helps v0.45.4
      • Olive Helps v0.44.2
      • Olive Helps v0.43.1
      • Olive Helps v0.42.1
      • Olive Helps v0.41.4
      • Olive Helps v0.40.2
      • Olive Helps v0.39.4 & LDK v3.16.0
      • Olive Helps v0.38.8 & LDK v3.15.0
      • Olive Helps v0.36.5
      • Olive Helps v0.36.4
    • Archive
      • Olive Helps v0.36.3 & LDK v3.14.0
      • Olive Helps v0.34.4
      • LDK v3.13.0
      • Olive Helps v0.32.2 & LDK v3.12.0
      • Olive Helps v0.31.2 & LDK v3.11.0
      • Olive Helps v0.30.2 & LDK v3.10.0
      • Olive Helps v0.29.4
      • Olive Helps v0.29.3 & LDK v3.9.0
      • Olive Helps v0.28.3 & LDK v3.8.0
      • Olive Helps v0.27.7
      • Olive Helps v0.27.5
      • Olive Helps v.027.4
      • Olive Helps v0.27.2 & LDK v3.7.0
      • Olive Helps v0.25.3 & LDK v3.5.1
      • Olive Helps v0.24.6 & LDK v3.4.0
      • Olive Helps v0.23.2 & LDK v3.3.0
      • Olive Helps v0.22.3 & LDK v3.2.0
Powered by GitBook
On this page

Was this helpful?

  1. APTITUDES

Browser

This Aptitude, combined with the Olive Helps browser extension, allows an author to interact with your browser.

PreviousWhat are Aptitudes?NextClipboard

Last updated 3 years ago

Was this helpful?

This Aptitude only works if you have the Olive Helps browser extension installed. Currently, we have extensions for , , and Edge.

Please note: Microsoft Edge operates as a Chrome plugin.

These documents will reference frameId and parentFrameId - for more information on frames, check out the Chrome Extension Docs here.

listenNavigation

Calls callback on any navigation event pushed from a browser running the Olive Helps extension.

import { browser } from '@oliveai/ldk';

const URL_TO_OPEN = 'https://www.oliveai.dev/';
const newTabId = await browser.openTab(URL_TO_OPEN);

const browserListener = await browser.listenNavigation((navDetails) => {
    /*
    navDetails will be:
    {
        frameId: number,
        navigationType: string (real | history)
        parentFrameId: number,
        tabId: number,
        timestamp: number,
        url: string
    }
    */
    
    // navDetails.url === URL_TO_OPEN: true
    // navDetails.tabId === newTabId: true

    // Cancel the listener when a specific URL is opened by the user
    if (navDetails.url === URL_TO_OPEN) {
        browserListener.cancel();
    }
})

listenTextSelection

Calls callback on any text selection event pushed from a browser running the Olive Helps extension.

import { browser } from '@oliveai/ldk';

const browserTextListener = await browser.listenTextSelection((value) => {
    // Cancel the listener when a specific string is selected in the browser
    const TEXT_WE_NEED = 'The quick brown fox jumped';
    if (value === TEXT_WE_NEED) {
        browserTextListener.cancel();
    }
}

listenNetworkActivity

Listens for any network activity by the browser. The resulting callback for the listener takes in an activity event with the following structure.

export interface NetworkActivityDetails {
  tabId: number; // Which tab the activity originated from
  requestUrl: string; // The url for fetching data
  method: string; // The HTTP method used in the request
  requestBody: null | string; // Null or a string of the request payload
  domain: string; // The originating url
}

import { browser } from '@oliveai/ldk';

const networkActivityListener= await browser.listenNetworkActivity((event) => {
    console.log(JSON.stringify(event)); // This will produce the structure above
    networkActivityListener.cancel();
}

openTab

Opens a tab in the browser running the Olive Helps extension.

import { browser } from '@oliveai/ldk';

const URL_TO_OPEN = 'https://www.oliveai.dev/';

// This will open a new tab in your browser, and return the new tab's ID
const newTabId = await browser.openTab(URL_TO_OPEN);

// This will open a new tab in your browser and return both the tab id and the source html for the page
const {id, sourceHTML}= await browser.openTab(URL_TO_OPEN, {includeSouce: true});

openWindow

Opens a window in the browser running the Olive Helps extension.

import { browser } from '@oliveai/ldk';

const URL_TO_OPEN = 'https://www.oliveai.dev/';

// This will open a new window in your browser, and return the new window's ID
const newWindowId = await browser.openWindow(URL_TO_OPEN);

// This will open a new window in your browser, and return the new windows id and the source html for the page
const {id, sourceHTML} = await browser.openWindow(URL_TO_OPEN, { includeSource: true});

sourceHTML

Retrieves the html source for a given address.

import { browser } from '@oliveai/ldk';
const URL_TO_READ = 'https://www.oliveai.dev/';
const { id, sourceHTML } = await browser.sourceHTML(URL_TO_READ);

In this example, let's assume we have a Whisper with a button, this instructs you to click the button in order to open a browser window that automatically navigates to your profile page for your insurance provider. And after doing so, you'll instructed to select the insurance ID and group ID.

import { browser } from '@oliveai/ldk';

export async function getInsuranceInfo() {
    // Assume we know the 9-digit ID will be on the page as 'ID: 123456789'
    // and the 8-digit group as 'Group: 12345678'
    const ID_SELECTION_PATTERN = /ID: .{9}/g
    const GROUP_SELECTION_PATTERN = /Group: .{8}/g
    const CIGNA_USER_PROFILE_URL = 'https://my.cigna.com'

    await browser.openWindow(CIGNA_USER_PROFILE_URL);

    let insuranceId;
    let insuranceGroup;

    const browserListener = await browser.listenTextSelection(value => {
        const idMatches = value.match(ID_SELECTION_PATTERN);
        const groupMatches = value.match(GROUP_SELECTION_PATTERN);

        // If there is a match, assign the variable
        if (idMatches) insuranceId = idMatches[0];
        if (groupMatches) insuranceGroup = groupMatches[0];
        
        // If insuranceId and insuranceGroup are defined, we can close
        // the listener and continue with the rest of the logic of our loop
        if (insuranceId && insuranceGroup) {
            browserListener.cancel();
            // Create/update whispers or execute other logic here
            // using the ID and Group
        }
    })
}

To use the Browser aptitude, you will need to specify which domains your Loop will be using in your package.json under the ldk object like shown below. If you do not specify a domain your Loop attempts to access, Olive Helps will reject the request. This is done to ensure you feel confident that a Loop isn't sending or getting information to something unexpected.

The URLs you add will need to include a path suffix /*

...
"ldk": {
  "permissions":
  {
    "browser": {
      "urlDomains": [
        {
          "value": "*.fda.gov", // Allows any subdomain of fda.gov, but
        },                      // not any path
        {
           "value": "*.fda.gov/*", // Allows any subdomain and path of fda.gov
        },
        ...
      ]
    },
    ...
  }
},
...
Chrome
Firefox