27.12.2020

Chrome Web App Mac

Important: Chrome will be removing support for Chrome Apps on all platforms. Chrome browser and the Chrome Web Store will continue to support extensions. Read the announcement and learn more about migrating your app. This document describes how to use the USB API to. Download Google Chrome for Mac to make the most of the Web with optimized, personalized, synced, and secured browsing. Google Chrome has had 28 updates within the past 6 months.

Important: Chrome will be removing support for Chrome Apps on all platforms. Chrome browser and the Chrome Web Store will continue to support extensions. Read the announcement and learn more about migrating your app.

This document describes how to use the USB API to communicatewith USB devices. Some devices are not accessible through the USB API(see the Caveats section below for details).Chrome Apps can also connect to serial andBluetooth devices.

Samples: For examples that illustrate how Chrome Apps can connect to hardware devices, see theserial,servo, andusb samples.

For background information about USB, see the official USB specifications.
USB in a NutShell is a reasonable crash course that you may find helpful.

Manifest requirement

The USB API requires the 'usb' permission in the manifest file:

In addition, in order to prevent finger-printing, you must declare all the device types you want to access in the manifest file. Each type of USB device corresponds to a vendor id/product id (VID/PID) pair. You can use usb.getDevices to enumerate devices by their VID/PID pair.

You must declare the VID/PID pairs for each type of device you want to use under the usbDevices permission in your app's manifest file, as shown in the example below:

Note that only decimal numbers are allowed in JSON format. You cannot use hexadecimal numbers in these fields.

Since Chrome 57, the requirement for declaring all the device types in the app manifest is relaxed for apps running as Chrome OS kiosk apps. For kiosk apps, you can use the interfaceClass permission property to request permission to access USB devices that:

  • implement a USB interface of a specific interface class
  • have a specific USB device class
For example, the following usbDevices permission would grant an app access to all USB devices that implement a printer interface (interface class code 7), and to USB hub devices (device class code 9):

For the list of acceptable interfaceClass values, see USB Class Codes.

The interfaceClass property can be combined with the vendorId property to get access only to USB devices from a specific vendor, as demonstrated by the following example:

Note that usbDevices permissions with interfaceClass/message-app-wont-open-on-mac.html. property have effect only when the app is running in kiosk session - outside a kiosk session these permissions will be ignored.

Finding a device

To determine whether one or more specific devices are connected to a user's system, use the usb.getDevices method:


Parameter (type)Description
EnumerateDevicesOptions (object)An object specifying both a vendorId (long) and productId (long) used to find the correct type of device on the bus. Your manifest must declare the usbDevices permission section listing all the vendorId and deviceId pairs your app wants to access.
callback (function)Called when the device enumeration is finished. The callback will be executed with one parameter, an array of Device objects with three properties: device, vendorId, productId. The device property is a stable identifier for a connected device. It will not change until the device is unplugged. The detail of the identifier is opaque and subject to change. Do not rely on its current type.
If no devices are found, the array will be empty.

Example:

Opening a device

Once the Device objects are returned, you can open a device usingusb.openDevice to obtain a connection handle. You can onlycommunicate with USB devices using connection handles.

PropertyDescription
deviceObject received in usb.getDevices callback.
data (arraybuffer)Contains the data sent by the device if the transfer was inbound.

Example:

Not every device can be opened successfully. In general, operating systemslock down many types of USB interfaces (e.g. keyboards and mice, mass storagedevices, webcams, etc.) and they cannot be claimed by user applications.On Linux (other than Chrome OS), once an interface of a device is locked down bythe OS, the whole device is locked down (because all the interfaces shares thesame device file), even if the other interfaces of the device can be used intheory. On Chrome OS, you can request access to unlocked interfaces using theusb.requestAccess method. If permitted, the permission broker willunlock the device file for you.

To simplify the opening process, you can use the usb.findDevicesmethod, which enumerates, requests access, and opens devices in one call:

which is equivalent to:

USB transfers and receiving data from a device

The USB protocol defines four types of transfers: control, bulk, isochronous and interrupt. These transfers are described below.

Transfers can occur in both directions: device-to-host (inbound), and host-to-device (outbound). Due to the nature of the USB protocol, both inbound and outbound messages must be initiated by the host (the computer that runs the Chrome app). For inbound (device-to-host) messages, the host (initiated by your JavaScript code) sends a message flagged as 'inbound' to the device. The details of the message depend on the device, but usually will have some identification of what you are requesting from it. The device then responds with the requested data. The device's response is handled by Chrome and delivered asynchronously to the callback you specify in the transfer method. An outbound (host-to-device) message is similar, but the response doesn't contain data returned from the device.

For each message from the device, the specified callback will receive an event object with the following properties:


PropertyDescription
resultCode (integer)0 is success; other values indicate failure. An error string can be
read from chrome.extension.lastError when a failure is
indicated.
data (arraybuffer)Contains the data sent by the device if the transfer was inbound.

Example:

CONTROL transfers

Control transfers are generally used to send or receive configuration or command parameters to a USB device. The controlTransfer method always sends to/reads from endpoint 0, and no claimInterface is required. The method is simple and receives three parameters:


Parameter (types)Description
connectionHandleObject received in usb.openDevice callback.
transferInfoParameter object with values from the table below. Check your USB device protocol specification for details.
transferCallback()Invoked when the transfer has completed.

Values for transferInfo object:

ValueDescription
requestType (string)'vendor', 'standard', 'class' or 'reserved'.
recipient (string)'device', 'interface', 'endpoint' or 'other'.
direction (string)'in' or 'out'. The 'in' direction is used to notify the device that
it should send information to the host. All communication on a USB
bus is host-initiated, so use an 'in' transfer to allow a device to
send information back.
request (integer)Defined by your device's protocol.
value (integer)Defined by your device's protocol.
index (integer)Defined by your device's protocol.
length (integer)Only used when direction is 'in'. Notifies the device that this is the amount of data the host is expecting in response.
data (arraybuffer)Defined by your device's protocol, required when direction is 'out'.

Example:

ISOCHRONOUS transfers

Isochronous transfers are the most complex type of USB transfer. They are commonly used for streams of data, like video and sound. To initiate an isochronous transfer (either inbound or outbound), you must use the usb.isochronousTransfer method:


ParameterDescription
connectionHandleObject received in usb.openDevice callback.
isochronousTransferInfoParameter object with the values in the table below.
transferCallback()Invoked when the transfer has completed.

Values for isochronousTransferInfo object:

ValueDescription
transferInfo (object)An object with the following attributes:
direction (string): 'in' or 'out'.
endpoint (integer): defined by your device. Usually can be found by looking at an USB instrospection tool, like lsusb -v
length (integer): only used when direction is 'in'. Notifies the device that this is the amount of data the host is expecting in response.
Should be AT LEAST packets × packetLength.
data (arraybuffer): defined by your device's protocol; only used when direction is 'out'.
packets (integer)Total number of packets expected in this transfer.
packetLength (integer)Expected length of each packet in this transfer.

Example:

Notes: One isochronous transfer will contain isoTransferInfo.packets packets of isoTransferInfo.packetLength bytes. If it is an inbound transfer (your code requested data from the device), the data field in the onUsbEvent will be an ArrayBuffer of size transferInfo.length. It is your duty to walk through this ArrayBuffer and extract the different packets, each starting at a multiple of isoTransferInfo.packetLength bytes.
If you are expecting a stream of data from the device, remember that you will have to send one 'inbound' transfer for each transfer you expect back. USB devices don't send transfers to the USB bus unless the host explicitly requests them through 'inbound' transfers.

BULK transfers

Bulk transfers are commonly used to transfer a large amount of non-time-sensitive data in a reliable way. usb.bulkTransfer has three parameters: mac run dmg as admin


ParameterDescription
connectionHandleObject received in usb.openDevice callback.
transferInfoParameter object with the values in the table below.
transferCallbackInvoked when the transfer has completed.

Google Apps For Mac

Values for transferInfo object:

ValueDescription
direction (string)'in' or 'out'.
endpoint (integer)Defined by your device's protocol.
length (integer)Only used when direction is 'in'. Notifies the device that this is the amount of data the host is expecting in response.
data (ArrayBuffer)Defined by your device's protocol; only used when direction is 'out'.

Example:

INTERRUPT transfers

Interrupt transfers are used to small amount of time sensitive data. Since all USB communication is initiated by the host, host code usually polls the device periodically, sending interrupt IN transfers that will make the device send data back if there is anything in the interrupt queue (maintained by the device). usb.interruptTransfer has three parameters:


ParameterDescription
connectionHandleObject received in usb.openDevice callback.
transferInfoParameter object with the values in the table below.
transferCallbackInvoked when the transfer has completed. Notice that this callback doesn't contain the device's response. The purpose of the callback is simply to notify your code that the asynchronous transfer requests has been processed.

Values for transferInfo object:

ValueDescription
direction (string)'in' or 'out'.
endpoint (integer)Defined by your device's protocol.
length (integer)Only used when direction is 'in'. Notifies the device that this is the amount of data the host is expecting in response.
data (ArrayBuffer)Defined by your device's protocol; only used when direction is 'out'.

Example:

Caveats

Not all devices can be accessed through the USB API. In general, devices are not accessible because either the Operating System's kernel or a native driver holds them off from user space code. Some examples are devices with HID profiles on OSX systems, and USB pen drives.

On most Linux systems, USB devices are mapped with read-only permissions by default. To open a device through this API, your user will need to have write access to it too. A simple solution is to set a udev rule. Create a file /etc/udev/rules.d/50-yourdevicename.rules with the following content:

Then, just restart the udev daemon: service udev restart. You can check if device permissions are set correctly by following these steps:

Google Chrome Mac App

  • Run lsusb to find the bus and device numbers.
  • Run ls -al /dev/bus/usb/[bus]/[device]. This file should be owned by group 'plugdev' and have group write permissions.

Your app cannot do this automatically since this this procedure requires rootaccess. We recommend that you provide instructions to end-users and link to theCaveats section on this page for an explanation.

On Chrome OS, simply call usb.requestAccess. The permission broker does this for you.

The latest developer channel release of Google Chrome for Mac houses a number of flags that change the way ‘Hosted Apps’ are handled.

We saw in December how Google plans to make Hosted Apps a consistent part of the Chrome OS and Windows experience using new ‘window frames’ housing navigation controls and URL information.

Running these web-based applications, glorified bookmarks that are now listed under ‘Websites’ on the Chrome Web Store, alongside offline savvy Chrome Apps on OS X is harder than on other desktop operating systems (Mac builds of Chrome don’t use the Aura UI framework).

But Chrome is tackling the experiential differential. Three changes in the latest Chrome Dev Channel release make using Hosted Apps on OS X easier, two in the form of flags, and one by default:

  • ‘Hosted App Shims’ — app launchers for Spotlight, Launchpad, Dock
  • ‘On Quit Notification’ — stops Hosted Apps closing when Chrome is quit
  • Navigation controls in menu bar — back, forward and reload options

Before we take a closer look at each change in turn, remember that (as with all experimental features) what’s listed below is subject to change and is not guaranteed to filter down to stable channels.

Hosted App Shims

Chrome Apps can be launched from pretty much anywhere on OS X. They appear in the Chrome App Launcher, Spotlight, Launchpad and Finder, and lodge a separate entry in the Dock like a regular native Mac app.

When set to run in their own window, Hosted Apps (like Gmail, Google Docs, Google Maps, etc.) currently behave differently. Their launchers appear in the Chrome App Launcher only and are not listed as separate or pinnable entries in the Dock.

The new “mac app shim” flag in the latest Chrome Dev builds fixes these issues in one swoop. It gifts newly installed url apps — note the ‘newly installed’ bit; it doesn’t yet affect those already installed — their own independent app shortcut, icon and OS presence.

That means you can switch between open apps in the Dock and launch them from Spotlight, Launchpad, Alfred, and so on.

Navigation Controls

Navigating Hosted Apps set to run in their own window is easier in the latest dev build. Basic navigation controls are now listed in the menu bar. These are History > back, forward and View > Reload.

Background Mode Notification

Chrome App Download

In current builds you can quit Chrome and all Hosted Apps at the same time. But say you’re midway through working in Pixlr Editor or a Word Online document – that wouldn’t be ideal.

Download Chrome App For Mac

With the ‘Display a notification when quitting Chrome if hosted apps are currently running’ flag enabled in the latest Chrome for Mac Dev builds you get a warning prompt when attempting to close the browser with apps in the background .

Chrome Web App Mac Desktop

This warning prompt is already in use for Chrome Apps.

Chrome App Integration on OS X Is Nothing New

Google began trialling Finder integration for Chrome Apps on OS X last year and more recently added the ability to open Google Drive files from the website directly in local apps, with all changes made being synced back to the cloud.

Hosted Apps — or “websites” as Google now calls them — remain glorified bookmarks, even with this new set of system integration. But don’t count them out entirely.

Chrome Browser For Mac Download

Google’s working on new initiatives, like Service Workers, to offer powerful new features to “websites”. While largely targeted to mobile use cases (i.e., a website can run offline and update in the background, like an app can), expect to reap benefits on the desktop side, too. 32 bit apps mac.