• Stars
    star
    396
  • Rank 104,715 (Top 3 %)
  • Language
    Objective-C
  • License
    Apache License 2.0
  • Created over 10 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A mini mobile web device lab

Mini Mobile Device Lab

The Mini Mobile Device Lab (MMDL) is a framework to help developers test pages across multiple devices, including phones, tablets, Desktops, etc. It works with Android, iOS, Windows (including phone, RT and desktop), and Chrome OS.

When a A URL is pushed, the devices will simultaneously open the page, allowing you to see how the page looks across each device. In addition, it will also run the page through services like PageSpeed Insights, Web Page Test, and check for specific open web features like HTTPS, Service Worker, Theme Color, and Web App Manifests.

Basic Architecture

A web front end is used to send URLs to Firebase, which acts as the back end, syncing URLs out to all of the connected devices.

Android: The Node client app running on a Raspberry Pi (or other computer) listens for new URLs and uses ADB to fire a browse intent, opening the URL on the device.

iOS & Windows: A native app receives URLs from Firebase and opens them in a WebView.

ChromeOS or Chrome Desktop: A Chrome Extension listens for new URLs sent from Firebase and opens a new tab or uses the existing tab to display the content.

Getting Started

Setup Firebase & front end

  1. Create a new Firebase app (and account if necessary)
  2. Import the initial config from init-data.json
  3. In Security & Rules, paste the contents of rules.json
  4. In Login & Auth, enable Anonymous Authentication
  5. In Secrets, create a new Secret, and note it down for later.
  6. In PiLabFrontEnd, copy config.sample.js to config.js
  7. Fill in the attributes of config.js accordingly.
    1. firebaseUrl is the URL for your Firebase project.
    2. firebaseKey is the api key for that Firebase project.
  8. Deploy the PiLabFrontEnd, you can use Firebase’s static hosting or one of your choosing

If you want to test pages using PageSpeed Insights or WebPage Test, be sure to get an API Key and update config.apiKeys in Firebase with the appropriate key.

Set up the server

The server is used to control the looper, manage test execution, update Firebase with results tests and handle a few other functions. If you don’t want to use the looper or test pages, you can skip this section.

PreRequisites: Node (0.12.x), ADB

  1. Clone the repo to a local directory
  2. In the PiLab folder, run npm install
  3. Copy config.sample.json to config.json.
  4. Fill in the attributes of config.json accordingly.
    1. firebaseUrl is the URL for your Firebase project.
    2. firebaseKey is the api key for that Firebase project.
    3. frontEndUrl is the URL for where you've hosted the PiLabFrontEnd.
  5. Start the server with node server.js.
  6. Plug a single Android device into this computer, it will be used for testing the open web features.

Android

PreRequisites: Node (0.12.x), ADB

  1. Follow the same step as required to set up the server, but instead, start the client with node client.js
  2. On each Android device, enable Developer Mode
  3. Under Developer Options:
    1. Enable USB Debugging
    2. Enable Stay awake
  4. Install Stay Alive! to prevent the screen from dimming or turning off
  5. Plug the Android devices into the computer or USB hub.
  6. When prompted, allow USB debugging, and be sure to choose Remember this computer.

iOS

PreRequisites: XCode & all of the other pre-reqs for building iOS apps

  1. Clone the repo to a local directory and open the project in XCode
  2. In ViewController.m, change fbAppName to the Firebase App name you created earlier
  3. Deploy app to iOS devices

Windows

Because there is no native Firebase SDK for Windows, we’ve used two WebViews to control the experience. One WebView (wvListener) listens for notifications pushed via window.external.notify, when a message is received, it sets the URL of the second WebView (wvMain) to the new URL.

PreRequisites: Visual Studio 2012 & all of the other pre-reqs for building Universal Windows Apps.

  1. Clone the repo to a local directory and open the proejct in Visual Studio
  2. In MainPage.xaml for both MMDL-uni.Windows and MMDL-uni.WindowsPhone, update the URL of <WebView x:Name="wvListener" Source="https://goog-mtv-device-lab.appspot.com/notify.html" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></WebView> to the PiLabFrontEnd URL you created earlier.
  3. In Package.appxmanifest for both MMDL-uni.Windows and MMDL-uni.WindowsPhone, update the URL of <Rule Match="https://goog-mtv-device-lab.appspot.com/notify.html" Type="include" /> to the PiLabFrontEnd URL you created earlier
  4. Deploy app to the appropriate devices

Sending URLs to devices

Once the devices have been setup, you can use the web front end to send URLs. The simplest way is to use index.html to send a single URL, it will pause the looper for 3 minutes then automatically restart it. For more advanced control, use admin.html, which allows you to change the displays on different devices, adjust the loop time, add or modify URLs in the loop, etc.

Using Raspberry Pi’s as Controllers

Raspberry Pi’s work well for controlling the Android devices or as the Server, and is how we set up the MMDL at Google IO 2015.

There are a few things to be aware of:

  • Raspberry Pi’s have limited USB bandwidth, which may cause issues if you try to connect more than 7 devices to a Pi, we limited each Pi to 6 devices.
  • We recommended that you boot the Pi into command line mode instead of the GUI to lower CPU usage.
  • We used the 7-port Ankar AH240 for our USB hub since it provided a sufficient number of USB ports and enough power to keep most devices fully charged while in use.
  • ADB is not available pre-compiled for the Pi, so you’ll need to compile your own, or download one that someone else has compiled.
  • You may need to start ADB with sudo for proper functionality.

Auto Starting PiLab on Boot To Command Line

If your Pi boots to the command line, you can automatically start the PiLab client (or server) with these steps.

  1. On the Pi, run sudo nano /etc/inittab to edit the inittab file
  2. Find the line 1:2345:respawn:/sbin/getty 115200 tty1 and comment it out by adding a # at the beginning of the line.
  3. Just below the commented out line, add 1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1.
  4. Save and Exit nano by pressing CTRL-X, followed by Y
  5. [Optional] Reboot the Pi to confirm it automatically logs in.
  6. If you haven’t already, clone the repo to your Pi
  7. Edit the local .profile file and add ~/login.sh to the end.
  8. Create ~/login.sh and add the following code:
cd ~/MiniMobDevLab
echo Starting PiLab in 5 seconds
sleep 5
./client.sh
  1. Make the ~/login.sh file executable by running chmod +x ~/login.sh
  2. Reboot the Pi, and it should automatically log in and start the client app.

Contributing

The Mini Mobile Device Lab is an open source project and we welcome your contributions! Before submitting a pull request, please review CONTRIBUTING.md and make sure that there is an issue filed describing the fix or new content. If you don't complete these steps, we won't be able to accept your pull request, sorry.

More Repositories

1

squoosh

Make images smaller using best-in-class codecs, right in the browser.
TypeScript
20,633
star
2

quicklink

⚡️Faster subsequent page-loads by prefetching in-viewport links during idle time
JavaScript
10,937
star
3

ndb

ndb is an improved debugging experience for Node.js, enabled by Chrome DevTools
JavaScript
10,914
star
4

comlink

Comlink makes WebWorkers enjoyable.
TypeScript
10,702
star
5

carlo

Web rendering surface for Node applications
JavaScript
9,326
star
6

ProjectVisBug

FireBug for designers › Edit any webpage, in any state https://a.nerdy.dev/gimme-visbug
JavaScript
5,348
star
7

sw-precache

[Deprecated] A node module to generate service worker code that will precache specific resources so they work offline.
JavaScript
5,236
star
8

react-adaptive-hooks

Deliver experiences best suited to a user's device and network constraints
JavaScript
5,070
star
9

ui-element-samples

A collection of prototyped UI elements
JavaScript
4,101
star
10

sw-toolbox

[Deprecated] A collection of service worker tools for offlining runtime requests
JavaScript
3,621
star
11

webpack-libs-optimizations

Using a library in your webpack project? Here’s how to optimize it
3,358
star
12

critters

🦔 A Webpack plugin to inline your critical CSS and lazy-load the rest.
JavaScript
3,330
star
13

psi

PageSpeed Insights Reporting for Node
JavaScript
3,103
star
14

lighthousebot

Run Lighthouse in CI, as a web service, using Docker. Pass/Fail GH pull requests.
JavaScript
2,236
star
15

bubblewrap

Bubblewrap is a Command Line Interface (CLI) that helps developers to create a Project for an Android application that launches an existing Progressive Web App (PWAs) using a Trusted Web Activity.
TypeScript
2,201
star
16

preload-webpack-plugin

Please use https://github.com/vuejs/preload-webpack-plugin instead.
JavaScript
2,162
star
17

worker-plugin

👩‍🏭 Adds native Web Worker bundling support to Webpack.
JavaScript
1,914
star
18

prerender-loader

📰 Painless universal pre-rendering for Webpack.
JavaScript
1,912
star
19

simplehttp2server

A simple HTTP/2 server for development
Go
1,735
star
20

jsvu

JavaScript (engine) Version Updater
JavaScript
1,698
star
21

size-plugin

Track compressed Webpack asset sizes over time.
JavaScript
1,675
star
22

clooney

Clooney is an actor library for the web. Use workers without thinking about workers.
JavaScript
1,419
star
23

browser-fs-access

File System Access API with legacy fallback in the browser
JavaScript
1,316
star
24

proxx

A game of proximity
TypeScript
1,296
star
25

application-shell

Service Worker Application Shell Architecture
JavaScript
1,169
star
26

dark-mode-toggle

A custom element that allows you to easily put a Dark Mode 🌒 toggle or switch on your site:
JavaScript
1,140
star
27

pwacompat

PWACompat to bring Web App Manifest to older browsers
JavaScript
1,130
star
28

container-query-polyfill

A polyfill for CSS Container Queries
TypeScript
1,106
star
29

idlize

Helper classes and methods for implementing the idle-until-urgent pattern
JavaScript
1,048
star
30

houdini-samples

Demos for different Houdini APIs
JavaScript
967
star
31

css-triggers

A reference for the render impact of mutating CSS properties.
JavaScript
893
star
32

jsbi

JSBI is a pure-JavaScript implementation of the official ECMAScript BigInt proposal.
JavaScript
886
star
33

howto-components

Literate code examples for common UI patterns.
JavaScript
851
star
34

tooling.report

tooling.report a quick way to determine the best build tool for your next web project, or if tooling migration is worth it, or how to adopt a tool's best practice into your existing configuration and code base.
JavaScript
844
star
35

page-lifecycle

PageLifecycle.js is a tiny JavaScript library that allows developers to easily observe Page Lifecycle API state changes cross browser
JavaScript
795
star
36

css-paint-polyfill

CSS Custom Paint / Paint Worklet polyfill with special browser optimizations.
JavaScript
709
star
37

estimator.dev

🧮 Calculate the size and performance impact of switching to modern JavaScript syntax.
JavaScript
667
star
38

web-audio-samples

Web Audio API samples by Chrome Web Audio Team
JavaScript
666
star
39

picture-in-picture-chrome-extension

JavaScript
655
star
40

comlink-loader

Webpack loader to offload modules to Worker threads seamlessly using Comlink.
JavaScript
616
star
41

pwa-wp

WordPress feature plugin to bring Progressive Web Apps (PWA) to Core
PHP
603
star
42

ProgressiveWordPress

A Sample WordPress-based Progressive Web App
JavaScript
570
star
43

gulliver

A PWA directory, focusing on collecting PWA best practices and examples.
JavaScript
549
star
44

web-push-codelab

JavaScript
549
star
45

text-app

A text editor for ChromeOS and Chrome
JavaScript
547
star
46

progressive-tooling

A list of community-built, third-party tools that can be used to improve page performance
JavaScript
545
star
47

wasm-feature-detect

A small library to detect which features of WebAssembly are supported.
JavaScript
518
star
48

svgomg-twa

A sample that project Trusted Web Activities technology to wrap SVGOMG in an Android Application
Shell
512
star
49

web-vitals-report

Measure and report on your Web Vitals data in Google Analytics
JavaScript
495
star
50

text-editor

A text editor build on the Native File System APIs
JavaScript
487
star
51

chrome-for-testing

JavaScript
463
star
52

pptraas.com

Puppeteer as a service
JavaScript
455
star
53

progressive-rendering-frameworks-samples

Samples and demos from the Progressive Rendering I/O talk
JavaScript
407
star
54

wasm-bindgen-rayon

An adapter for enabling Rayon-based concurrency on the Web with WebAssembly.
JavaScript
404
star
55

webm-wasm

webm-wasm lets you create webm videos in JavaScript via WebAssembly.
C++
386
star
56

cronet-sample

A sample for the Cronet library
Java
381
star
57

link-to-text-fragment

Browser extension that allows for linking to arbitrary text fragments.
JavaScript
371
star
58

webpack-training-project

A training project for learning Webpack optimizations
JavaScript
368
star
59

pinch-zoom

TypeScript
366
star
60

samesite-examples

Examples of using the SameSite cookie attribute in a variety of language, libraries, and frameworks.
HTML
365
star
61

airhorn

Air horn
JavaScript
361
star
62

buffer-backed-object

Buffer-backed objects in JavaScript.
JavaScript
349
star
63

first-input-delay

A JavaScript library for measuring First Input Delay (FID) in the browser.
JavaScript
347
star
64

AutoWebPerf

AutoWebPerf provides a flexible and scalable framework for running web performance audits with arbitrary audit tools including PageSpeedInsights, WebPageTest and more.
JavaScript
345
star
65

tti-polyfill

Time-to-interactive polyfill
JavaScript
333
star
66

react-shrine

"Shrine" Progressive Web App sample built with React
JavaScript
331
star
67

dynamic-import-polyfill

A fast, tiny polyfill for dynamic import() that works in all module-supporting browsers
JavaScript
320
star
68

wasi-fs-access

This is a demo shell powered by WebAssembly, WASI, Asyncify and File System Access API.
TypeScript
293
star
69

native-url

Node's url module implemented using the built-in URL API.
JavaScript
284
star
70

two-up

TypeScript
270
star
71

adaptive-loading

Demos for Adaptive Loading - differentially deliver fast, lighter experiences for users on slow networks & devices
JavaScript
266
star
72

so-pwa

A progressive web app to read Stack Overflow content.
JavaScript
255
star
73

import-from-worker

It’s like import(), but runs the module in a worker.
JavaScript
246
star
74

sample-pie-shop

Example e-commerce site to explore PWA (Progressive Web App) use cases.
JavaScript
236
star
75

file-drop

A simple file drag and drop custom-element
TypeScript
226
star
76

form-troubleshooter

TypeScript
213
star
77

postcss-jit-props

A CSS custom property helper based on PostCSS. Supply a pool of variables and this plugin will add them to the stylesheet as they are used.
JavaScript
203
star
78

serial-terminal

Demo application for the Web Serial API.
TypeScript
191
star
79

audioworklet-polyfill

🔊 Polyfill AudioWorklet using the legacy ScriptProcessor API.
JavaScript
190
star
80

http2-push-manifest

Generate a list of static resources for http2 push.
JavaScript
187
star
81

pointer-tracker

Track mouse/touch/pointer events for a given element.
TypeScript
183
star
82

pr-bot

🤖 Compare your base branch to a pull request and run plugins over it to view differences
JavaScript
179
star
83

discovery

Discoveries on Sustainable Loading research
177
star
84

imagecapture-polyfill

MediaStream ImageCapture polyfill. Take photos from the browser as easy as .takePhoto().then(processPhoto)
JavaScript
176
star
85

tasklets

JavaScript
176
star
86

credential-management-sample

Credential Management Sample
HTML
157
star
87

houdini.how

A community-driven gathering place for CSS Houdini worklets and resources.
JavaScript
150
star
88

wasm-av1

Port of the AV1 Video codec to WebAssembly
C
150
star
89

perf-track

Tracking framework performance and usage at scale
Svelte
148
star
90

kv-storage-polyfill

A polyfill for the kv-storage built-in module.
JavaScript
145
star
91

wadb

A TypeScript implementation of the Android Debug Bridge(ADB) protocol over WebUSB
TypeScript
143
star
92

telnet-client

TypeScript
142
star
93

pwa-workshop-codelab

JavaScript
142
star
94

http2push-gae

Drop-in HTTP2 push on App Engine
HTML
140
star
95

chromeos_smart_card_connector

Smart Card Connector App for Chrome OS
C++
133
star
96

snapshot

TypeScript
133
star
97

devwebfeed

Firehose of team++ resources
JavaScript
130
star
98

sample-currency-converter

A sample currency conversion Progressive Web App
JavaScript
129
star
99

extension-manifest-converter

Python
119
star
100

json-parse-benchmark

Benchmark comparing JSON.parse vs. equivalent JavaScript literals across JavaScript engines.
JavaScript
119
star