Giter Club home page Giter Club logo

chromeos_network_file_share's Introduction


*** THIS EXTENSION IS DEPRECATED. SINCE CHROME 71 THIS FUNCTIONALITY IS BUILT IN TO CHROME OS ***


On Chrome 71 or higher you can:

  • Open the files app
  • Click the "three dot menu" in the top right
  • Choose "Add New Service"
  • Choose "SMB file share"

A dialog in settings will open (in 72 and later it's a standalone dialog). Enter your share information as before.

You can uninstall the chrome app as it will be deprecated in the near future.

If you have bugs with the new implementation you can open them at crbug.com under component "Platform>Apps>FileManager" with SMB in the title.

There will be no more work on this implementation.


Overview

This is a Chrome App that extends the built in File Manager to be able to support connecting to SMB file shares.

The NaCl port is currently patched from Samba 4.1.22.

Setup

  1. Download the NaCl SDK and unzip it as directed. https://developer.chrome.com/native-client/sdk/download

  2. Update the SDK and get the pepper_50 version.

cd nacl_sdk
./naclsdk update
./naclsdk update pepper_50
export NACL_SDK_ROOT=/path/to/nacl_sdk/pepper_50
  1. Get depot_tools and gclient.
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. Put depot_tools on the path (or put it in your .bashrc) https://www.chromium.org/developers/how-tos/install-depot-tools

  2. Get WebPorts (aka NaCl Ports).

mkdir webports
cd webports
gclient config --name=src https://chromium.googlesource.com/webports.git
gclient sync
  1. Install a missing dependency from the NaCl SDK.
sudo apt-get install libglib2.0-0:i386
  1. Build Samba.
cd webports/src
./make_all.sh samba F=1 V=1
  1. Get the App code.
git clone https://github.com/GoogleChrome/chromeos_network_file_share
  1. Install bower. https://syntaxsugar.github.io/posts/2014/05/how-to-install-bower-on-ubuntu-1404-lts/

*Note: If you are a Google employee, please follow sites/nodejs/installing-node for node installation

sudo apt-get install nodejs
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo apt-get install npm
sudo npm install -g bower
  1. Get the bower dependencies.
cd chromeos_network_file_share/app
bower install
  1. Install Vulcanize and Crisper.
sudo npm install -g vulcanize
sudo npm install -g crisper
  1. Setup build environment

    Set NACL_SDK_ROOT if not done above

  2. Finally you can build!

cd chromeos_network_file_share
nacl/build.sh

Tests

We use Mocha and Chai as our test framework.

To download the testing dependencies:

npm install --only=dev

To run the tests:

npm test

Arm Nacl_IO Bug

There is currently a bug that causes a crash on ARM Release builds. Until the bug is fixed the workaround is to build libnacl_io.so with optimizations turned off. If you don't do this extra step prior to building the app the ARM build will crash.

Before building the app edit $NACL_SDK_ROOT/src/nacl_io/Makefile and add the following after the line 'CFLAGS += -DNACL_IO_LOGGING=0'

ifeq ($(NACL_ARCH), arm)
  CFLAGS += -O1
endif

// then rebuild nacl_io
cd $NACL_SDK_ROOT/src/nacl_io/
make V=1 CONFIG=Release TOOLCHAIN=glibc NACL_ARCH=arm

That will rebuild libnacl_io.so with optimization disabled. Then rebuild the app.

Nacl SDK

Update SDK (currently using pepper_canary).

./naclsdk update pepper_canary --force

Building The App/Extension

Setup environment

export NACL_SDK_ROOT=/path/to/your/nacl/sdk

Build

nacl/build.sh

Package

tools/to_temp.sh

Troubleshooting

In file included from nacl_fsp.cc:24:
./SambaFsp.h:20:10: fatal error: 'samba/libsmbclient.h' file not found
#include "samba/libsmbclient.h"

If you see this error follow the steps above for 'Setup environment'

chromeos_network_file_share's People

Contributors

allenktv avatar illiminable avatar tomchiverton avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chromeos_network_file_share's Issues

Allowing streaming of readDirectory

The current JS->NaCl infrasctructure has a 1:1 request response model.

Need to implement something in the message router to allow 1:many to allow partial results to stream back to the files app.

This is important for navigating to very large directories.

"operations taking longer than expected"

I understand that this is a Chrome OS limit, but it takes few minutes to actually see files.
The samba server works fine with other devices. It has only ~150 files to show, so it's not a huge amount.

It doesn't show any helpful errors or notifications to troubleshoot the problem. Sometimes only restart helps.

It would be nice if after unmount the application would remember your entered details.

ARM Asus C201 Chromebook.

In common.js - DOMContentLoaded plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. plugin.html:1 Size specified, but not requested. plugin.html:1 Last modification time specified, but not requested. log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 13 SHOULD_RETRY log.js:68 WARNING: readDirectory[13] failed on attempt 1 of 3. Retrying... log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 14 SHOULD_RETRY log.js:68 WARNING: readDirectory[14] failed on attempt 1 of 3. Retrying... log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 13 SHOULD_RETRY log.js:68 WARNING: readDirectory[13] failed on attempt 2 of 3. Retrying... log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 14 SHOULD_RETRY log.js:68 WARNING: readDirectory[14] failed on attempt 2 of 3. Retrying... log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 13 SHOULD_RETRY log.js:68 ERROR: readDirectory[13] failed on attempt 3 of 3. Retrying... log.js:68 ERROR: readDirectory failed with FAILED plugin.html:1 Unchecked runtime.lastError while running fileSystemProviderInternal.operationRequestedError: NOT_FOUND at chrome-extension://ndjpildffkeodjdaeebdhnncfhopkajk/samba.js:643:13 log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=110 errtxt=Connection timed out log.js:68 ERROR: rejecting message 15 SHOULD_RETRY log.js:68 WARNING: readDirectory[15] failed on attempt 1 of 3. Retrying... log.js:24 NACL ERROR: Error performing readDirectory:smbc_opendir: errno=103 errtxt=Software caused connection abort log.js:68 ERROR: rejecting message 14 SHOULD_RETRY log.js:68 ERROR: readDirectory[14] failed on attempt 3 of 3. Retrying... log.js:68 ERROR: readDirectory failed with FAILED plugin.html:1 Unchecked runtime.lastError while running fileSystemProviderInternal.operationRequestedError: NOT_FOUND at chrome-extension://ndjpildffkeodjdaeebdhnncfhopkajk/samba.js:643:13 plugin.html:1 NativeClient: NaCl module crashed

Share could not be mounted

I tried to mount a file for my new job and we were unable to share the mount? It says "share could not be mounted"

We have the username and password correct, with case sensitivity. We also imputed the share bath as stated: "//00.0.00.000/Files" With the correct numbers.

Any help?

Configure samba app by policy

For the enterprise use case, admins need to configure the app with policies e.g. the default share location.

This is crucial for enterprise deployments as the only alternative is fanning out instructions to users via email and that is not a viable alternative in companies, especially large ones where these configurations might differ across deployments.

This is an enterprise feature which is described fully here

https://www.chromium.org/administrators/configuring-policy-for-extensions

support for end to end encryption

in my smb config I set:
smb encrypt = mandatory
server signing = mandatory

server signing works but end to end encryption won't work. Support for was added in Samaba 3.2 and above. Please update the version that supports encryption. Thank You.

"Not Compatible?"

I have the original 2011 Samsung Series 5 Chromebook. The webstore displays a red not compatible button. Google searches reveal some hints at 32 bit not being supported. Am I orphaned with this old machine?

Optimize the app package size

Right now I think possibly the bower_components folder that is inside the app is redundant. It gets vulcanized into mount_dialog.js/html so shouldn't be needed inside the package.

Opening large photos on SMB NAS ends many times in time out disconnect

  1. Opening large photos on SMB NAS ends many times in time out disconnect. It takes about 30 seconds to open a 5MB photo. it is so slow.
  2. No photo thumbnails preview.
  3. network connection should be a feature at the files app. Not just an extension.
  4. path mounting path/address should have the ability to be saved.

Try to restart a crash NaCl module

When a real chrome app has a NaCl crash on a Chromebook the only resolution is to do chrome://restart

See if the module crash can be caught and reloaded.

Image Preview/Gallery Not Loading Video Playback Unwatchable

I am using an Acer Chromebook 14 and my drive is a MyBook Network drive. I love that I can see the network files right in the file explorer on the Chromebook; however, the images previews do not load, and the gallery view never loads. Videos stop so much they are not watchable.

Add i18n support for SMB file share app

SMB file share has many strings which are currently hard coded in English.

We should use chrome.i18n to translate those strings to the language selected by the user.
Nov 12, 2015 Delete comment

Within share copy is not supported

You can copy to or from a share but not within it. The version of Samba currently being used doesn't support server side copy. To implement now would be copying the file from the server to client and back again.

Preferable to upgrade Samba version but need to investigate whether this feature is only supported in some versions of SMB. Worst case the brute force method could be implemented.

100 MB glibc subdirectory -- could it be smaller?

I've been alarmed at how big Google Chrome has been becoming lately. With a fair number of extensions added, it's close to a gigabyte.

One of the contributors to this large size is this Network File Share for Chrome OS extension. It includes a 100+-megabyte directory called glibc that contains a libarm and a lib64 subdirectory, which presumably include support for both ARM and Intel architectures. Also, I see a lot of files (e.g.: *.o, *.dep, *.map) that seem to be files that don't normally need to be distributed to the end user.

It would be great if this extension could be made smaller. E.g., by omitting the un-needed *.o etc. files, deleting the un-needed libarm or li64 at install time, stripping debugging symbols, etc. The people who need these can I'm sure figure out how to get them.

Review logging

Make a pass over all logging and remove redundant/spammy logs and categorize as appropriate

Errors when acessing RO files

I can't copy or access files that are marked Read Only.
Removing the RO flag and the files can be accessed immediately

Connected to a share on a Windows 7 PC.
The share required a username and password.
The share is RW. I can copy files from local storage to the SMB share.

Can browse some files, copy to local storage and open them using the picture viewer and music player.

Tried to copy other files that were read-only and get errors,

"Copy operation failed. The file could not be modified."

and from the console

NACL ERROR: Error performing openFile:smbc_open: errno=13 errtxt=Permission denied
log.js:68 ERROR: rejecting message 915 ACCESS_DENIED
log.js:68 ERROR: openFile rejected promise
log.js:24 NACL ERROR: Error performing openFile:smbc_open: errno=13 errtxt=Permission denied

When trying to copy the RO file from smb to local storage the file is created on local storage but has zero size and the above error message appears.

Also when I try to open RO image I get an error message "This file could not be displayed."

Trying to play a RO music file it appears to be opened by the music player, the name is displayed, but it does not play and eventually skips to the next file which also doesn't play (is also RO.).

Same problem occurs on a RW shared on a Fritz Box 3370 modem/router

Version 50.0.2661.103 (64-bit)
Platform 7978.74.0 (Official Build) stable-channel falco
Firmware Google_Falco.4389.92.0

Should retry NetBIOS scan

The resolution protocol can be unreliable. Occasionally it fails and simply retrying would fix it.

Should retry the scan since it's a fatal error otherwise.

NativeClient: NaCl module crashed

Whilst accessing a file from an SMB share on a Fritz Box a pop-up appeared saying:

"An operation is taking longer than expected. Do you want to abort it?"

Checking the log it looks like the NaCL module crashed.

The current operation was simply playing a file through the music player.

Is there a way to get more debug or other diagnostics?

The access denied message in the log was probably related to trying to open and use RO files.

NACL ERROR: Error performing openFile:smbc_open: errno=13 errtxt=Permission denied
log.js:68 ERROR: rejecting message 1716 ACCESS_DENIED
log.js:68 ERROR: openFile rejected promise
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1762 SHOULD_RETRY
log.js:68 WARNING: readFile[1762] failed on attempt 1 of 3. Retrying...
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1762 SHOULD_RETRY
log.js:68 WARNING: readFile[1762] failed on attempt 2 of 3. Retrying...
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1762 SHOULD_RETRY
log.js:68 ERROR: readFile[1762] failed on attempt 3 of 3. Retrying...
log.js:68 ERROR: readFile failed with FAILED
log.js:24 NACL ERROR: closeFile:smbc_close: Error closing fd
extensions::lastError:133 Unchecked runtime.lastError while running fileSystemProviderInternal.operationRequestedSuccess: NOT_FOUND
at . (chrome-extension://ndjpildffkeodjdaeebdhnncfhopkajk/samba.js:350:17)reportIfUnchecked @ extensions::lastError:133handleResponse @ extensions::sendRequest:78
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1806 SHOULD_RETRY
log.js:68 WARNING: readFile[1806] failed on attempt 1 of 3. Retrying...
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1806 SHOULD_RETRY
log.js:68 WARNING: readFile[1806] failed on attempt 2 of 3. Retrying...
log.js:24 NACL ERROR: Error performing readFile:smbc_read: errno=103 errtxt=Software caused connection abort
log.js:68 ERROR: rejecting message 1806 SHOULD_RETRY
log.js:68 ERROR: readFile[1806] failed on attempt 3 of 3. Retrying...
log.js:68 ERROR: readFile failed with FAILED
log.js:24 NACL ERROR: closeFile:smbc_close: Error closing fd
plugin.html:1 NativeClient: NaCl module crashed

Possibility to save servers

Does this project accept pull requests?

The app should have basic ability to save mounted servers instead of typing each time everything by hand.

Support a form of network browsing

This could be just adding something like a default 'Network Neighborhood' share that has eg. servers at the top level etc. Or it could be putting a browse button on the mount dialog that gives you share choices.

Perhaps the latter is better for now at least until other perf issues with large highly nested shares are fixed.

JIT authentication

Allow having mounts without credentials (possibly configured by policy).

When the user navigates to a folder and it fails with permission denied, prompt the user for credentials and mount on demand.

A further extension to this is to allow this work on non-root folders. For example it is not that uncommon to have a share structure like below where the child nodes have different permission to the siblings and/or parents.

Users

  • User1
  • User2

Stores

  • Location1
  • Location2

Wrong filename appearing in music player

When accessing files via the Network File Share on two occasions I have had the wrong file name appearing in the music player. This is a low impact issue.

I'm using two sources of SMB shares, a Win 7 PC and a Fritz Box modem / router. I will pay more attention which one I'm using when it happens.

On the second occasion I was using the Fritz Box as the SMB server.

This issue is intermittent or I haven't noticed the pattern to reproduce it yet.

I have selected a file to be played by the standard Chrome OS music player and the filename shown has been that of the first file in a previously viewed directory, instead of the file selected to be played.

Investigate error when mounting at a server root

Investigate the error when a user mounts a path like smb://myserver. Currently this won't work because that path identifies a server not a share. Implementing #10 would allow navigating the other non file share nodes as virtual directories.

This ticket tracks making sure that the error message in this case tells the user they need to mount at the share root ie. smb://myserver/myshare . It seems possible right now this fails with permission denied which is misleading.

Fix performance issues with Samba file system app

Issue 1 - Files.app downloads the contents of all image files the first time it sees them attempting to generate a thumbnail. This gives very pathological behaviour for network providers especially in shares heavy with large images.

** Tomasz is looking at stopping this for NETWORK fsps but that will take multiple releases to make it to stable channel.

** Investigating workaround to give broken or hardcoded data uri to prevent it

** Implemented returning a broken data uri which prevents the files app downloading every image in a folder. Once Tomasz implements a fix this can be undone and we can still allow thumbs from EXIF data which is far more lightweight.

** Implication is that images will not have thumbnails on shared drives (that’s what linux does anyway).

** Possible other future fixes;
** Have the provider generate thumbs from the content the first time the content is downloaded for real.
** In some cases could try to parse the windows thumbs.db file (unknown how successful or reliable that might be - but that’s how windows does it)
** (Likely not practical for most users) - Get thumbs generated on the server side.

** Implemented a short term cache to handle this. It prevents ⅔’s of the network round trips. There’s a still an underlying issue in the system that makes this less efficient than it could be.

Issue 2 - The File.app reads the metadata for each file upon navigation a minimum 2 times and any file that becomes visible in the list a thrid time. For network providers this means 3n network roundtrips which becomes pathological with hundreds or thousands of files.

** In process of implementing a metadata cache in the provider. This will reduce the lookup to one NaCl roundtrip and n network roundtrips. Maybe other potential improvements in future.

view thumbnails

Hello,

I am using this extension to access on a smb share path over my network.

It work wells but is there a way to have thumbnails on images ?

Try to remove redundant smbc_lseek's

The chrome FSP API is has no explicit seek - instead it just requests reads with an offset and a length.

Current implementation just always seeks but could track the current offset with the file handle and only seek when needed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.