module.exports = class Application {
loadWindow = () => {
+ app.setPath('userData', path.join(app.getPath('userData'), 'Stable'));
protocol.registerSchemesAsPrivileged([
{ scheme: 'my', privileges: { standard: true, bypassCSP: true, secure: true } }
]);
const path = require('path');
const fs = require('fs');
+const package = require(`${remote.app.getAppPath()}/package.json`);
+
const Config = require('electron-store');
-const config = new Config({
- defaults: {
- design: {
- homeButton: false,
- darkTheme: false,
- theme: 'default'
- },
- homePage: {
- defaultPage: 'my://newtab',
- defaultEngine: 'Google',
- searchEngines: [
- {
- name: 'Google',
- url: 'https://www.google.com/search?q=%s'
- },
- {
- name: 'Bing',
- url: 'https://www.bing.com/search?q=%s'
- },
- {
- name: 'Yahoo! Japan',
- url: 'https://search.yahoo.co.jp/search?p=%s'
- },
- {
- name: 'goo',
- url: 'https://search.goo.ne.jp/web.jsp?MT=%s'
- },
- {
- name: 'Google Translate',
- url: 'https://translate.google.com/?text=%s'
- },
- {
- name: 'Youtube',
- url: 'https://www.youtube.com/results?search_query=%s'
- },
- {
- name: 'Twitter',
- url: 'https://www.twitter.com/search?q=%s'
- },
- {
- name: 'GitHub',
- url: 'https://github.com/search?q=%s'
- }
- ]
- },
- adBlocker: true,
- window: {
- isCustomTitlebar: true,
- isMaximized: false,
- bounds: {
- width: 1100,
- height: 680
- }
- }
- },
-});
+const config = new Config();
// ファイルタイプの列挙体(のつもり)
const FileType = {
// ====================================================================== //
*/
+global.getAppName = (b) => {
+ if (location.protocol != 'my:') return;
+
+ return package.name;
+}
+
+global.getAppDescription = (b) => {
+ if (location.protocol != 'my:') return;
+
+ return package.description;
+}
+
+global.getAppVersion = (b) => {
+ if (location.protocol != 'my:') return;
+
+ return package.version;
+}
+
+/*
+// ====================================================================== //
+// ====================================================================== //
+// ====================================================================== //
+*/
+
global.clearBrowserData = (b) => {
if (location.protocol != 'my:') return;
theme: 'default'
},
homePage: {
- defaultPage: 'my://newtab',
+ defaultPage: 'my://home',
defaultEngine: 'Google',
searchEngines: [
{
let db = {};
db.history = new Datastore({
- filename: path.join(app.getPath('userData'), 'Files', 'History.db'),
+ filename: path.join(app.getPath('userData'), 'Stable', 'Files', 'History.db'),
autoload: true,
timestampData: true
});
db.bookmark = new Datastore({
- filename: path.join(app.getPath('userData'), 'Files', 'Bookmark.db'),
+ filename: path.join(app.getPath('userData'), 'Stable', 'Files', 'Bookmark.db'),
autoload: true,
timestampData: true
});
view.webContents.on('did-finish-load', (e) => {
if (view.isDestroyed()) return;
- if (String(windowId).startsWith('private'))
+ if (String(windowId).startsWith('private') && view.webContents.getURL().startsWith('my://'))
view.webContents.setUserAgent(defaultUserAgent + ' PrivMode');
window.setTitle(view.webContents.getTitle());
{
label: '戻る',
accelerator: 'Alt+Left',
+ icon: view.webContents.canGoBack() ? `${app.getAppPath()}/static/arrow_back.png` : `${app.getAppPath()}/static/arrow_back_inactive.png`,
enabled: view.webContents.canGoBack(),
click: () => { view.webContents.goBack(); }
},
{
label: '進む',
accelerator: 'Alt+Right',
+ icon: view.webContents.canGoForward() ? `${app.getAppPath()}/static/arrow_forward.png` : `${app.getAppPath()}/static/arrow_forward_inactive.png`,
enabled: view.webContents.canGoForward(),
click: () => { view.webContents.goForward(); }
},
{
- label: '再読み込み',
+ label: !view.webContents.isLoadingMainFrame() ? '再読み込み' : '読み込み中止',
accelerator: 'CmdOrCtrl+R',
- click: () => { view.webContents.reload(); }
+ icon: !view.webContents.isLoadingMainFrame() ? `${app.getAppPath()}/static/refresh.png` : `${app.getAppPath()}/static/close.png`,
+ click: () => { !view.webContents.isLoadingMainFrame() ? view.webContents.reload() : view.webContents.stop(); }
},
{ type: 'separator' },
{
label: 'Floating Window (Beta)',
type: 'checkbox',
checked: (floatingWindows.indexOf(windowId) != -1),
- enabled: (!window.isFullScreen() && !window.isMaximized()),
+ enabled: (!window.isFullScreen() && !window.isMaximized() && config.get('window.isCustomTitlebar')),
click: () => {
if (floatingWindows.indexOf(windowId) != -1) {
floatingWindows.filter((win, i) => {
{
label: '印刷',
accelerator: 'CmdOrCtrl+P',
+ icon: `${app.getAppPath()}/static/print.png`,
enabled: !view.webContents.getURL().startsWith('my://'),
click: () => { view.webContents.print(); }
},
} else if ((input.control || input.meta) && input.shift && input.key == 'R') {
e.preventDefault();
view.webContents.reloadIgnoringCache();
+ } else if (input.key == 'F11') {
+ e.preventDefault();
+ window.setFullScreen(!window.isFullScreen());
+ this.fixBounds(windowId, (floatingWindows.indexOf(windowId) != -1));
}
});
{
"name": "MyBrowser",
- "version": "1.4.7",
+ "description": "Cross-platform browser based on Chromium.",
+ "version": "1.5.2",
"private": true,
"main": "electron/Starter.js",
"homepage": "./",
"email": "aoichaan0513@gmail.com",
"url": "http://aoichaan0513.xyz"
},
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test --env=jsdom",
+ "eject": "react-scripts eject",
+ "electron:dev": "electron .",
+ "package": "electron-packager . MyBrowser --platform=all --arch=x64 --prune --out=release --overwrite",
+ "package:win": "electron-packager . MyBrowser --platform=win32 --arch=x64 --prune --out=release --overwrite --icon=./public/icon.ico",
+ "package:linux": "electron-packager . MyBrowser --platform=linux --arch=x64 --prune --out=release --overwrite",
+ "package:mas": "electron-packager . MyBrowser --platform=mas --arch=x64 --prune --out=release --overwrite",
+ "package:darwin": "electron-packager . MyBrowser --platform=darwin --arch=x64 --prune --out=release --overwrite",
+ "dev": "npm-run-all --parallel electron:dev start"
+ },
"dependencies": {
"@cliqz/adblocker": "0.8.0",
"axios": "0.18.0",
"tldts": "^4.0.6",
"username": "^5.0.0"
},
- "scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test --env=jsdom",
- "eject": "react-scripts eject",
- "electron:dev": "electron .",
- "package": "electron-packager . MyBrowser --platform=all --arch=x64 --prune --out=release --overwrite",
- "package:win": "electron-packager . MyBrowser --platform=win32 --arch=x64 --prune --out=release --overwrite --icon=./public/icon.ico",
- "package:linux": "electron-packager . MyBrowser --platform=linux --arch=x64 --prune --out=release --overwrite",
- "package:mas": "electron-packager . MyBrowser --platform=mas --arch=x64 --prune --out=release --overwrite",
- "package:darwin": "electron-packager . MyBrowser --platform=darwin --arch=x64 --prune --out=release --overwrite",
- "dev": "npm-run-all --parallel electron:dev start"
- },
"devDependencies": {
"electron": "^5.0.1",
"electron-builder": "^20.40.2",
--- /dev/null
+<!DOCTYPE html>
+<html lang="ja">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <title>ブックマーク</title>
+ <link href="my://style.css" type="text/css" rel="stylesheet" />
+ <script>
+ if (getDarkTheme()) {
+ document.write(
+ `<link href="https://stackpath.bootstrapcdn.com/bootswatch/3.4.1/darkly/bootstrap.min.css" type="text/css" rel="stylesheet" integrity="sha384-pKJMCXwCXq3HwRBt27cwwSmc0/DAo2BjRxGd7nEESEStk++p6LffHmhX9oqzVDUk" crossorigin="anonymous" />`
+ );
+ } else {
+ document.write(
+ `<link href="https://stackpath.bootstrapcdn.com/bootswatch/3.4.1/flatly/bootstrap.min.css" type="text/css" rel="stylesheet" integrity="sha384-bfWZLPtvQKHg/nZNhaO/ZW4Ba8ISud5CtEjnCTU6OR1yOq5zrrF+JP2o7om6rzLf" crossorigin="anonymous" />`
+ );
+ }
+ </script>
+ <link href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.min.css" type="text/css" rel="stylesheet" />
+ <link href="https://fonts.googleapis.com/css?family=Noto+Sans|Noto+Sans+JP|Roboto" type="text/css" rel="stylesheet" />
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" type="text/css" rel="stylesheet" />
+ <link rel="icon" sizes="any" href="my://public.svg" type="image/svg+xml">
+ <link rel="mask-icon" href="my://public.svg" color="black">
+</head>
+
+<body style="padding-top: 75px;">
+ <nav class="navbar navbar-default navbar-fixed-top">
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <a class="navbar-brand"><script>document.write(getAppName());</script></a>
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="#" data-toggle="modal" data-target="#clearModal">ブックマークをクリア</a></li>
+ </ul>
+ </div>
+ </div>
+ </nav>
+ <div class="container-fluid">
+ <div class="row">
+ <div class="col-md-3">
+ <ul class="nav nav-pills nav-stacked">
+ <li>
+ <a href="my://home/">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">home</i>
+ ホーム
+ </a>
+ </li>
+ <hr>
+ <li>
+ <a href="my://history/">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">history</i>
+ 履歴
+ </a>
+ </li>
+ <li>
+ <a href="my://downloads/">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">get_app</i>
+ ダウンロード
+ </a>
+ </li>
+ <li>
+ <a href="my://bookmarks/">
+ <i class="material-icons"
+ style="vertical-align: text-bottom; font-size: 16px;">bookmarks</i> ブックマーク
+ </a>
+ </li>
+ <li>
+ <a href="my://store/">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">shop</i>
+ WebApp Store
+ </a>
+ </li>
+ <li class="dropdown">
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">settings</i>
+ 設定
+ </a>
+ <ul class="dropdown-menu" style="width: 100%;">
+ <li><a href="my://settings/">ホーム</a></li>
+ <li class="divider"></li>
+ <li><a href="my://settings/#design">デザイン</a></li>
+ <li><a href="my://settings/#engine">検索エンジン</a></li>
+ <li><a href="my://settings/#adblock">広告ブロック</a></li>
+ <li><a href="my://settings/#window">ウィンドウ</a></li>
+ <li class="divider"></li>
+ <li><a href="my://settings/#about"><script>document.write(getAppName());</script> について</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="my://help/">
+ <i class="material-icons"
+ style="vertical-align: text-bottom; font-size: 16px;">help_outline</i> ヘルプ
+ </a>
+ </li>
+ </ul>
+ </div>
+ <div class="col-md-9" style="padding-right: 0px;">
+ <div style="padding: 15px; overflow-y: auto; height: calc(100vh - 75px);">
+ <h3>ブックマーク</h3>
+ <hr>
+ <script>
+ if (navigator.userAgent.indexOf('PrivMode') != -1) {
+ document.write(
+ `<div class="panel panel-default" id="private">
+ <div class="panel-heading">プライベート ブックマーク</div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-style" id="privMarkList">
+ <thead>
+ <tr>
+ <th class="table-title">タイトル</th>
+ <th class="table-url">URL</th>
+ <th style="width: 200px; white-space: nowrap;">追加日時</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <hr>`
+ );
+ }
+ </script>
+ <div class="panel panel-default" id="normal">
+ <div class="panel-heading">ブックマーク</div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-style" id="markList">
+ <thead>
+ <tr>
+ <th class="table-title">タイトル</th>
+ <th class="table-url">URL</th>
+ <th style="width: 200px; white-space: nowrap;">追加日時</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal fade" id="clearModal" tabindex="-1">
+ <div class="modal-dialog" style="z-index: 9999;">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"><span>×</span></button>
+ <h4 class="modal-title">ブックマークをクリア</h4>
+ </div>
+ <div class="modal-body">
+ これまでのブックマークをクリアします。
+ 続行を押すとブックマークがクリアされます。
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-link" data-dismiss="modal">閉じる</button>
+ <button type="button" class="btn btn-primary" id="clearBookmark">続行</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/locale/ja.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function () {
+ $(`a[href="${window.location.href}"]`).parent().addClass('active');
+
+ $('#clearBookmark').click(function () {
+ clearBookmark(true);
+ location.reload();
+ });
+
+ if (navigator.userAgent.indexOf('PrivMode') != -1) {
+ getBookmarks(true).then((data) => {
+ data.forEach((item, i) => {
+ $('#privMarkList').append($('<tr></tr>').append($('<td class="table-title"></td>').append($(`<a href="${item.url}"></a>`).text(item.title))).append($('<td class="table-url"></td>').text(item.url)).append($('<td></td>').text(moment(item.createdAt).format('YYYY/MM/DD HH:mm'))));
+ });
+ getBookmarks(false).then((data) => {
+ data.forEach((item, i) => {
+ $('#markList').append($('<tr></tr>').append($('<td class="table-title"></td>').append($(`<a href="${item.url}"></a>`).text(item.title))).append($('<td class="table-url"></td>').text(item.url)).append($('<td></td>').text(moment(item.createdAt).format('YYYY/MM/DD HH:mm'))));
+ });
+ });
+ });
+ } else {
+ getBookmarks(false).then((data) => {
+ data.forEach((item, i) => {
+ $('#markList').append($('<tr></tr>').append($('<td class="table-title"></td>').append($(`<a href="${item.url}"></a>`).text(item.title))).append($('<td class="table-url"></td>').text(item.url)).append($('<td></td>').text(moment(item.createdAt).format('YYYY/MM/DD HH:mm'))));
+ });
+ });
+ }
+ });
+ </script>
+</body>
+
+</html>
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html lang="ja">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <title>ホーム</title>
+ <link href="my://style.css" type="text/css" rel="stylesheet" />
+ <script>
+ if (getDarkTheme()) {
+ document.write(
+ `<link href="https://stackpath.bootstrapcdn.com/bootswatch/3.4.1/darkly/bootstrap.min.css" type="text/css" rel="stylesheet" integrity="sha384-pKJMCXwCXq3HwRBt27cwwSmc0/DAo2BjRxGd7nEESEStk++p6LffHmhX9oqzVDUk" crossorigin="anonymous" />`
+ );
+ } else {
+ document.write(
+ `<link href="https://stackpath.bootstrapcdn.com/bootswatch/3.4.1/flatly/bootstrap.min.css" type="text/css" rel="stylesheet" integrity="sha384-bfWZLPtvQKHg/nZNhaO/ZW4Ba8ISud5CtEjnCTU6OR1yOq5zrrF+JP2o7om6rzLf" crossorigin="anonymous" />`
+ );
+ }
+ </script>
+ <link href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.min.css" type="text/css" rel="stylesheet" />
+ <link href="https://fonts.googleapis.com/css?family=Noto+Sans|Noto+Sans+JP|Roboto" type="text/css" rel="stylesheet" />
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" type="text/css" rel="stylesheet" />
+ <link rel="icon" sizes="any" href="my://public.svg" type="image/svg+xml">
+ <link rel="mask-icon" href="my://public.svg" color="black">
+</head>
+
+<body style="padding-top: 75px;">
+ <nav class="navbar navbar-default navbar-fixed-top">
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <a class="navbar-brand">
+ <script>document.write(getAppName());</script></a>
+ <div class="navbar-form navbar-right" role="search" style="width: 75%;">
+ <input class="form-control" id="search" placeholder="Google で検索または URL を入力" style="width: 90%;"
+ onkeydown="handleKeydown();">
+ <button type="submit" class="btn btn-default">Search</button>
+ </div>
+ </div>
+ </div>
+ </nav>
+ <div class="container-fluid">
+ <div class="row">
+ <div class="col-md-3">
+ <ul class="nav nav-pills nav-stacked">
+ <li>
+ <a href="my://home/">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">home</i>
+ ホーム
+ </a>
+ </li>
+ <hr>
+ <li>
+ <a href="my://history/" target="_blank">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">history</i>
+ 履歴
+ </a>
+ </li>
+ <li>
+ <a href="my://downloads/" target="_blank">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">get_app</i>
+ ダウンロード
+ </a>
+ </li>
+ <li>
+ <a href="my://bookmarks/" target="_blank">
+ <i class="material-icons"
+ style="vertical-align: text-bottom; font-size: 16px;">bookmarks</i> ブックマーク
+ </a>
+ </li>
+ <li>
+ <a href="my://store/" target="_blank">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">shop</i>
+ WebApp Store
+ </a>
+ </li>
+ <li class="dropdown">
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+ <i class="material-icons" style="vertical-align: text-bottom; font-size: 16px;">settings</i>
+ 設定
+ </a>
+ <ul class="dropdown-menu" style="width: 100%;">
+ <li><a href="my://settings/" target="_blank">ホーム</a></li>
+ <li class="divider"></li>
+ <li><a href="my://settings/#design" target="_blank">デザイン</a></li>
+ <li><a href="my://settings/#engine" target="_blank">検索エンジン</a></li>
+ <li><a href="my://settings/#adblock" target="_blank">広告ブロック</a></li>
+ <li><a href="my://settings/#window" target="_blank">ウィンドウ</a></li>
+ <li class="divider"></li>
+ <li><a href="my://settings/#about" target="_blank">
+ <script>document.write(getAppName());</script> について</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="my://help/" target="_blank">
+ <i class="material-icons"
+ style="vertical-align: text-bottom; font-size: 16px;">help_outline</i> ヘルプ
+ </a>
+ </li>
+ </ul>
+ </div>
+ <div class="col-md-9" style="padding-right: 0px;">
+ <div style="padding: 15px; overflow-y: auto; height: calc(100vh - 75px);">
+ <script>
+ if (localStorage.getItem('isFirst') == true || localStorage.getItem('isFirst') == undefined) {
+ document.write(
+ `<div class="jumbotron">
+ <div class="container">
+ <h1>ようこそ</h1>
+ <p>新しいタブ ページはホームとして生まれ変わりました。</p>
+ </div>
+ </div>`
+ );
+ localStorage.setItem('isFirst', false);
+ }
+ </script>
+ <script>
+ if (navigator.userAgent.indexOf('PrivMode') != -1) {
+ document.write(
+ `<h5>プライベート モード</h5>
+ <hr>
+ <p>
+ 現在、プライベート モードで閲覧しています。プライベート モードでは、閲覧履歴やCookieなどが${getAppName()}に保存されません。<br>
+ また、ブックマークはプライベート ブックマークに保存されます。<br>
+ ※ プライベート ブックマークは、プライベート モードの時のみブックマークの表示や編集ができる機能です。<br>
+ ただし、ダウンロードしたファイルは通常通り保存されます。<br><br>
+ ${getAppName()} に<b>以下の情報は</b>保存されません。<br>
+ <ul>
+ <li>閲覧履歴</li>
+ <li>Cookieとサイトデータ</li>
+ <li>ログイン情報</li>
+ </ul>
+ </p>`
+ );
+ }
+ </script>
+ <h3>ホーム</h3>
+ <hr>
+ <div class="panel panel-default" id="normal">
+ <div class="panel-heading">
+ 最近の履歴
+ <a href="my://history" target="_blank" class="text-muted"
+ style="float: right;">すべての履歴を表示</a>
+ </div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped table-hover table-style" id="historyList">
+ <thead>
+ <tr>
+ <th class="table-title">タイトル</th>
+ <th class="table-url">URL</th>
+ <th style="width: 200px; white-space: nowrap;">閲覧日時</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/locale/ja.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function () {
+ $(`a[href="${window.location.href}"]`).parent().addClass('active');
+
+ $('#search').prop('placeholder', `${getSearchEngine().name} で検索または URL を入力`);
+
+ $('#search').autocomplete({
+ source: function (request, response) {
+ $.ajax({
+ url: "http://www.google.com/complete/search",
+ data: { hl: 'ja', client: 'firefox', q: request.term },
+ dataType: "jsonp",
+ type: "GET",
+ success: function (data) {
+ response(data[1]);
+ }
+ });
+ },
+ delay: 300,
+ minLength: 2,
+ });
+
+ if (getDarkTheme()) {
+ $('.topbar').css({ 'background-color': '#323232', 'color': 'white' });
+ $('.topbar > .title').css('color', 'white');
+ $('.topbar-search').css({ 'background-color': '#252525', 'color': 'white' });
+ $('div.nav > a.nav-item').css('color', 'white');
+ $('body').css('background-color', '#252525');
+
+ $('.nav-toggle').hover(function () {
+ $(this).css('background-color', 'rgba(130, 130, 130, 0.3)');
+ }, function () {
+ $(this).css('background-color', '');
+ });
+ } else {
+ $('.topbar').css({ 'background-color': '', 'color': '' });
+ $('.topbar > .title').css('color', '');
+ $('.topbar-search').css({ 'background-color': '', 'color': '' });
+ $('div.nav > a.nav-item').css('color', '');
+ $('body').css('background-color', '');
+
+ $('.nav-toggle').hover(function () {
+ $(this).css('background-color', 'rgba(0, 0, 0, 0.06)');
+ }, function () {
+ $(this).css('background-color', '');
+ });
+ }
+
+ getHistorys().then((data) => {
+ let v = 0;
+ data.forEach((item, i) => {
+ if (v > 9) return;
+ $('#historyList').append($('<tr></tr>').append($('<td class="table-title"></td>').append($(`<a href="${item.url}"></a>`).text(item.title))).append($('<td class="table-url"></td>').text(item.url)).append($('<td></td>').text(moment(item.createdAt).format('YYYY/MM/DD HH:mm'))));
+ v++;
+ });
+ });
+ });
+
+ function handleKeydown() {
+ let searchBar = $('#search');
+ if (event.keyCode != 13 || searchBar.val().length == 0 || searchBar.val() == '') return;
+
+ if (isURL(searchBar.val())) {
+ location.href = searchBar.val();
+ } else {
+ location.href = window.getSearchEngine().url.replace('%s', searchBar.val());
+ }
+ }
+
+ function isURL(input) {
+ const pattern = /^((?:\w+:)?\/\/([^\s.]+\.\S{2}|localhost[:?\d]*)|my:\/\/\S.*)\S*$/;
+
+ if (pattern.test(input)) {
+ return true;
+ }
+ return pattern.test(`http://${input}`);
+ }
+ </script>
+</body>
+
+</html>
\ No newline at end of file
import WindowMaximizeIcon from './Resources/windows/maximize.svg';
import WindowCloseIcon from './Resources/windows/close.svg';
-import BackIcon from './Resources/arrow_back.svg';
-import ForwardIcon from './Resources/arrow_forward.svg';
+import DarkBackIcon from './Resources/dark/arrow_back.svg';
+import DarkForwardIcon from './Resources/dark/arrow_forward.svg';
+import LightBackIcon from './Resources/light/arrow_back.svg';
+import LightForwardIcon from './Resources/light/arrow_forward.svg';
+
import BackInActiveIcon from './Resources/arrow_back_inactive.svg';
import ForwardInActiveIcon from './Resources/arrow_forward_inactive.svg';
-import ReloadIcon from './Resources/reload.svg';
-import HomeIcon from './Resources/home.svg';
-import InfomationIcon from './Resources/info.svg';
-import StarIcon from './Resources/star.svg';
-import StarFilledIcon from './Resources/star-filled.svg';
-import AccountIcon from './Resources/account.svg';
-import ShieldIcon from './Resources/shield.svg';
+
+import DarkReloadIcon from './Resources/dark/reload.svg';
+import DarkHomeIcon from './Resources/dark/home.svg';
+import LightReloadIcon from './Resources/light/reload.svg';
+import LightHomeIcon from './Resources/light/home.svg';
+
+import DarkInfomationIcon from './Resources/dark/info.svg';
+import LightInfomationIcon from './Resources/light/info.svg';
+
+import DarkStarIcon from './Resources/dark/star.svg';
+import DarkStarFilledIcon from './Resources/dark/star-filled.svg';
+import LightStarIcon from './Resources/light/star.svg';
+import LightStarFilledIcon from './Resources/light/star-filled.svg';
+
import FeedbackIcon from './Resources/feedback.svg';
-import MoreIcon from './Resources/more.svg';
+import AccountIcon from './Resources/account.svg';
+
+import DarkShieldIcon from './Resources/dark/shield.svg';
+import LightShieldIcon from './Resources/light/shield.svg';
+
+import DarkMoreIcon from './Resources/dark/more.svg';
+import LightMoreIcon from './Resources/light/more.svg';
-import PublicIcon from './Resources/public.svg';
-import PublicInActiveIcon from './Resources/public_inactive.svg';
-import AddIcon from './Resources/add.svg';
-import CloseIcon from './Resources/close.svg';
+import DarkPublicIcon from './Resources/dark/public.svg';
+import LightPublicIcon from './Resources/light/public.svg';
+
+import DarkAddIcon from './Resources/dark/add.svg';
+import DarkCloseIcon from './Resources/dark/close.svg';
+import LightAddIcon from './Resources/light/add.svg';
+import LightCloseIcon from './Resources/light/close.svg';
import isURL from './Utils/isURL';
const { remote, ipcRenderer, shell } = window.require('electron');
-const systemPreferences = remote.systemPreferences;
-const Menu = remote.Menu;
-const MenuItem = remote.MenuItem;
-const dialog = remote.dialog;
+const { app, systemPreferences, Menu, MenuItem, dialog } = remote;
const platform = window.require('electron-platform');
+const path = window.require('path');
const process = window.require('process');
const Config = window.require('electron-store');
-const config = new Config({
- defaults: {
- design: {
- homeButton: false,
- darkTheme: false,
- theme: 'default'
- },
- homePage: {
- defaultPage: 'my://newtab',
- defaultEngine: 'Google',
- searchEngines: [
- {
- name: 'Google',
- url: 'https://www.google.com/search?q=%s'
- },
- {
- name: 'Bing',
- url: 'https://www.bing.com/search?q=%s'
- },
- {
- name: 'Yahoo! Japan',
- url: 'https://search.yahoo.co.jp/search?p=%s'
- },
- {
- name: 'goo',
- url: 'https://search.goo.ne.jp/web.jsp?MT=%s'
- },
- {
- name: 'Google Translate',
- url: 'https://translate.google.com/?text=%s'
- },
- {
- name: 'Youtube',
- url: 'https://www.youtube.com/results?search_query=%s'
- },
- {
- name: 'Twitter',
- url: 'https://www.twitter.com/search?q=%s'
- },
- {
- name: 'GitHub',
- url: 'https://github.com/search?q=%s'
- }
- ]
- },
- adBlocker: true,
- window: {
- isCustomTitlebar: true,
- isMaximized: false,
- bounds: {
- width: 1100,
- height: 680
- }
- }
- },
-});
+const config = new Config();
class BrowserView extends Component {
constructor(props) {
{ type: 'separator' },
{
label: '履歴',
+ icon: `${app.getAppPath()}/static/history.png`,
click: () => { this.props.addTab('my://history'); }
},
{
label: 'ダウンロード',
+ icon: `${app.getAppPath()}/static/download.png`,
click: () => { this.props.addTab('my://history'); }
},
{
label: 'ブックマーク',
- click: () => { this.props.addTab('my://bookmark'); }
+ icon: `${app.getAppPath()}/static/bookmarks.png`,
+ click: () => { this.props.addTab('my://bookmarks'); }
+ },
+ { type: 'separator' },
+ {
+ label: '印刷',
+ icon: `${app.getAppPath()}/static/print.png`,
+ enabled: false,
+ click: () => { this.props.addTab('my://settings'); }
+ },
+ {
+ label: '検索',
+ icon: `${app.getAppPath()}/static/find.png`,
+ enabled: false,
+ click: () => { this.props.addTab('my://help'); }
},
{ type: 'separator' },
{
label: '設定',
+ icon: `${app.getAppPath()}/static/settings.png`,
click: () => { this.props.addTab('my://settings'); }
},
{
label: 'ヘルプ',
+ icon: `${app.getAppPath()}/static/help.png`,
click: () => { this.props.addTab('my://help'); }
},
{ type: 'separator' },
render() {
return (
<ContentWrapper>
- <Toolbar>
- <ToolbarButton isShowing={true} isRight={false} isMarginLeft={true} isEnabled={this.state.canGoBack} src={this.state.canGoBack ? BackIcon : BackInActiveIcon} size={24} title="前のページに戻る" onClick={() => { this.goBack(); }} />
- <ToolbarButton isShowing={true} isRight={false} isMarginLeft={false} isEnabled={this.state.canGoForward} src={this.state.canGoForward ? ForwardIcon : ForwardInActiveIcon} size={24} title="次のページに進む" onClick={() => { this.goForward(); }} />
- <ToolbarButton isShowing={true} isRight={false} isMarginLeft={false} isEnabled={true} src={!this.state.isLoading ? ReloadIcon : CloseIcon} size={24} title={!this.state.isLoading ? '再読み込み' : '読み込み中止'} onClick={() => { this.reload(); }} />
- <ToolbarButton isShowing={config.get('design.homeButton')} isRight={false} isMarginLeft={false} isEnabled={true} src={HomeIcon} size={24} title="ホームページに移動" onClick={() => { this.goHome(); }} />
- <ToolbarTextBoxWrapper buttonCount={config.get('design.homeButton') ? 6 : 5}>
- <ToolbarButton isShowing={true} isRight={false} isMarginLeft={true} isEnabled={true} src={InfomationIcon} size={24} title="このページの情報" />
+ <Toolbar isPrivate={String(this.props.windowId).startsWith('private')}>
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={this.state.canGoBack ? (!String(this.props.windowId).startsWith('private') ? LightBackIcon : DarkBackIcon) : BackInActiveIcon} size={24}
+ isShowing={true} isRight={false} isMarginLeft={true} isEnabled={this.state.canGoBack} title="前のページに戻る" onClick={() => { this.goBack(); }} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={this.state.canGoForward ? (!String(this.props.windowId).startsWith('private') ? LightForwardIcon : DarkForwardIcon) : ForwardInActiveIcon} size={24}
+ isShowing={true} isRight={false} isMarginLeft={false} isEnabled={this.state.canGoForward} title="次のページに進む" onClick={() => { this.goForward(); }} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={!this.state.isLoading ? (!String(this.props.windowId).startsWith('private') ? LightReloadIcon : DarkReloadIcon) : (!String(this.props.windowId).startsWith('private') ? LightCloseIcon : DarkCloseIcon)} size={24}
+ isShowing={true} isRight={false} isMarginLeft={false} isEnabled={true} title={!this.state.isLoading ? '再読み込み' : '読み込み中止'} onClick={() => { this.reload(); }} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={!String(this.props.windowId).startsWith('private') ? LightHomeIcon : DarkHomeIcon} size={24}
+ isShowing={config.get('design.homeButton')} isRight={false} isMarginLeft={false} isEnabled={true} title="ホームページに移動" onClick={() => { this.goHome(); }} />
+ <ToolbarTextBoxWrapper isPrivate={String(this.props.windowId).startsWith('private')} buttonCount={config.get('design.homeButton') ? 6 : 5}>
+ <ToolbarButton src={!String(this.props.windowId).startsWith('private') ? LightInfomationIcon : DarkInfomationIcon} size={12}
+ isShowing={true} isRight={false} isMarginLeft={true} isEnabled={true} title="このページの情報" />
<ToolbarTextBox value={this.state.barText} onChange={(e) => { this.setState({ barText: e.target.value }); }} onKeyDown={this.handleKeyDown} onContextMenu={this.handleContextMenu} />
- <ToolbarButton data-tip={this.state.isBookmarked ? `${this.props.windowId.startsWith('private') ? 'プライベート ' : ''}ブックマークから削除しました。` : `${this.props.windowId.startsWith('private') ? 'プライベート ' : ''}ブックマークに追加しました。`} ref="markTooltip" isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} src={this.state.isBookmarked ? StarFilledIcon : StarIcon} size={24} title={this.state.isBookmarked ? 'ブックマークから削除' : 'ブックマークに追加'} onClick={() => { this.bookMark(); }}>
+ <ToolbarButton data-tip={this.state.isBookmarked ? `${this.props.windowId.startsWith('private') ? 'プライベート ' : ''}ブックマークから削除しました。` : `${this.props.windowId.startsWith('private') ? 'プライベート ' : ''}ブックマークに追加しました。`} ref="markTooltip"
+ isPrivate={String(this.props.windowId).startsWith('private')} src={this.state.isBookmarked ? (!String(this.props.windowId).startsWith('private') ? LightStarFilledIcon : DarkStarFilledIcon) : (!String(this.props.windowId).startsWith('private') ? LightStarIcon : DarkStarIcon)} size={12}
+ isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} title={this.state.isBookmarked ? 'ブックマークから削除' : 'ブックマークに追加'} onClick={() => { this.bookMark(); }}>
<Tooltip effect="solid" place="left" event="no-event" />
</ToolbarButton>
</ToolbarTextBoxWrapper>
- <ToolbarButton isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} src={FeedbackIcon} size={24} title="フィードバックの送信" />
- <ToolbarDivider />
- <ToolbarButton isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} src={this.props.windowId.startsWith('private') ? ShieldIcon : AccountIcon} size={24} title={this.props.windowId.startsWith('private') ? 'プライベートモード' : process.env.USERNAME} onClick={() => { this.userMenu(); }} />
- <ToolbarButton isShowing={true} isRight={true} isMarginLeft={false} isEnabled={true} src={MoreIcon} size={24} title="メニュー" onClick={() => { this.moreMenu(); }} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={FeedbackIcon} size={24}
+ isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} title="フィードバックの送信" />
+ <ToolbarDivider isPrivate={String(this.props.windowId).startsWith('private')} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={this.props.windowId.startsWith('private') ? (!String(this.props.windowId).startsWith('private') ? LightShieldIcon : DarkShieldIcon) : AccountIcon} size={24}
+ isShowing={true} isRight={true} isMarginLeft={true} isEnabled={true} title={this.props.windowId.startsWith('private') ? 'プライベートモード' : process.env.USERNAME} onClick={() => { this.userMenu(); }} />
+ <ToolbarButton isPrivate={String(this.props.windowId).startsWith('private')} src={!String(this.props.windowId).startsWith('private') ? LightMoreIcon : DarkMoreIcon} size={24}
+ isShowing={true} isRight={true} isMarginLeft={false} isEnabled={true} title="メニュー" onClick={() => { this.moreMenu(); }} />
</Toolbar>
</ContentWrapper>
);
<TabContainer>
{this.state.tabs.map((tab, i) => {
return (
- <Tab isActive={tab.id == this.state.current} isFixed={tab.fixed} onClick={() => { ipcRenderer.send(`browserview-select-${this.props.match.params.windowId}`, { id: tab.id }); }} onContextMenu={this.handleContextMenu.bind(this, tab.id)}>
- <TabIcon src={tab.icon != undefined ? tab.icon : PublicIcon} width={18} height={18} />
- <TabTitle isFixed={tab.fixed} title={tab.title}>{tab.title}</TabTitle>
- <TabCloseButton isActive={tab.id == this.state.current} isFixed={tab.fixed} isRight={true} src={CloseIcon} size={14} title="このタブを閉じる" onClick={() => { this.removeTab(tab.id); }} />
+ <Tab isPrivate={String(this.props.match.params.windowId).startsWith('private')} isActive={tab.id == this.state.current} isFixed={tab.fixed} onClick={() => { ipcRenderer.send(`browserview-select-${this.props.match.params.windowId}`, { id: tab.id }); }} onContextMenu={this.handleContextMenu.bind(this, tab.id)}>
+ <TabIcon src={tab.icon != undefined ? tab.icon : (!String(this.props.match.params.windowId).startsWith('private') ? LightPublicIcon : DarkPublicIcon)} width={18} height={18} />
+ <TabTitle color={this.getForegroundColor(!String(this.props.match.params.windowId).startsWith('private') ? (platform.isWin32 || platform.isDarwin ? `#${systemPreferences.getAccentColor()}` : '#353535') : '#353535')} isFixed={tab.fixed} title={tab.title}>{tab.title}</TabTitle>
+ <TabCloseButton isActive={tab.id == this.state.current} isFixed={tab.fixed} isRight={true} src={!String(this.props.match.params.windowId).startsWith('private') ? LightCloseIcon : DarkCloseIcon} size={14} title="このタブを閉じる" onClick={() => { this.removeTab(tab.id); }} />
</Tab>
);
})}
</TabContainer>
- <TabButton isRight={true} src={AddIcon} size={24} title="新しいタブを開く" onClick={() => { this.addTab(); }} />
+ <TabButton isRight={true} src={!String(this.props.match.params.windowId).startsWith('private') ? LightAddIcon : DarkAddIcon} size={24} title="新しいタブを開く" onClick={() => { this.addTab(); }} />
</Tabs>
<WindowButtons isCustomTitlebar={config.get('window.isCustomTitlebar')}>
<WindowButton isClose={false} title="最小化" onClick={() => { remote.getCurrentWindow().minimize(); }}>
height: 100%;
padding: 6px ${paddingSize}px;
position: relative;
- background: ${props => props.isActive ? '#f9f9fa' : 'initial'};
+ background: ${props => props.isActive ? (!props.isPrivate ? '#f9f9fa' : '#353535') : 'initial'};
border-top: ${props => props.isActive ? `solid 2px #0a84ff` : 'solid 2px transparent'};
border-right: solid 0.5px #8b8b8b;
- color: ${props => props.isActive ? 'black' : 'white'};
+ color: ${props => props.isActive ? (!props.isPrivate ? 'black' : 'white') : 'white'};
font-size: 11px;
overflow: hidden;
white-space: nowrap;
box-sizing: border-box;
-webkit-app-region: no-drag;
&:hover {
- background-color: ${props => !props.isActive ? 'rgba(196, 196, 196, 0.4)' : '#f9f9fa'};
+ background-color: ${props => !props.isActive ? 'rgba(196, 196, 196, 0.4)' : (!props.isPrivate ? '#f9f9fa' : '#353535')};
}
`;
width: 100%;
height: 40px;
display: flex;
- background: #f9f9fa;
+ background: ${props => !props.isPrivate ? '#f9f9fa' : '#353535'};
border-bottom: solid 1px #e1e1e2;
box-sizing: border-box;
`;
box-sizing: border-box;
float: ${props => props.isRight ? 'right' : 'left'};
&:hover {
- ${props => props.isEnabled && 'background-color: rgba(0, 0, 0, 0.06);'}
+ ${props => props.isEnabled && `background-color: ${!props.isPrivate ? 'rgba(0, 0, 0, 0.06)' : 'rgba(130, 130, 130, 0.3)'};`}
}
`;
const buttonSize = 30;
export const ToolbarTextBoxWrapper = styled.div`
- background: white;
+ background: ${props => !props.isPrivate ? 'white' : '#252525'};
border: solid 1px #c1c1c1;
border-radius: 2px;
- font-size: 14.5px;
outline: none;
+ color: ${props => !props.isPrivate ? 'black' : 'white'};
+ font-size: 14.5px;
width: calc((100% - 40px * ${props => props.buttonCount}) - 25px);
height: auto;
margin: 5px;
box-sizing: border-box;
outline: none;
cursor: initial;
+ background: unset;
border: none;
border-left: solid 1px #c1c1c1;
border-right: solid 1px #c1c1c1;
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- version="1.1"
- id="svg3729"
- sodipodi:docname="arrow_back_inactive.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
- <metadata
- id="metadata3735">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs3733" />
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1017"
- id="namedview3731"
- showgrid="false"
- inkscape:zoom="35.333333"
- inkscape:cx="12"
- inkscape:cy="12"
- inkscape:window-x="-8"
- inkscape:window-y="-8"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg3729" />
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path
d="M0 0h24v24H0z"
fill="none"
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- version="1.1"
- id="svg3761"
- sodipodi:docname="arrow_forward_inactive.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
- <metadata
- id="metadata3767">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs3765" />
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1017"
- id="namedview3763"
- showgrid="false"
- inkscape:zoom="35.333333"
- inkscape:cx="12"
- inkscape:cy="12"
- inkscape:window-x="-8"
- inkscape:window-y="-8"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg3761" />
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path
d="M0 0h24v24H0z"
fill="none"
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff">
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff">
+ <path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#000000">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#000000">
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
\ No newline at end of file
--- /dev/null
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" fill="#000000">
+ <path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/>
+ <path d="M0 0h24v24H0z" fill="none"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- version="1.1"
- id="svg26"
- sodipodi:docname="public_inactive.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
- <metadata
- id="metadata32">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs30" />
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1017"
- id="namedview28"
- showgrid="false"
- inkscape:zoom="35.333333"
- inkscape:cx="12"
- inkscape:cy="12"
- inkscape:window-x="-8"
- inkscape:window-y="-8"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg26" />
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path
d="M0 0h24v24H0z"
fill="none"
-'use strict';
-
const builder = require('electron-builder');
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('./app/package.json', 'utf8'));
config: {
'appId': `org.aoichaan0513.${packageJson.name}`,
'productName': packageJson.name,
+ 'copyright': `Copyright 2019 ${packageJson.author.name}. All rights reserved.`,
'asar': true,
+ 'fileAssociations': [
+ {
+ 'name': 'Document',
+ 'description': packageJson.name,
+ 'role': 'Viewer',
+ 'ext': 'html'
+ }
+ ],
'nsis': {
'installerIcon': './static/icon.ico',
'uninstallerIcon': './static/icon.ico'
},
'linux': {
- 'target': 'deb',
+ 'category': 'Network',
+ 'target': [
+ {
+ 'target': 'AppImage',
+ 'arch': ['ia32', 'x64']
+ }
+ ],
'icon': './static/icon.ico',
},
},
-'use strict';
-
const builder = require('electron-builder');
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('./app/package.json', 'utf8'));
config: {
'appId': `org.aoichaan0513.${packageJson.name}`,
'productName': packageJson.name,
+ 'copyright': `Copyright 2019 ${packageJson.author.name}. All rights reserved.`,
'asar': true,
+ 'fileAssociations': [
+ {
+ 'name': 'Document',
+ 'description': packageJson.name,
+ 'role': 'Viewer',
+ 'ext': 'html'
+ }
+ ],
'nsis': {
'installerIcon': './static/icon.ico',
'uninstallerIcon': './static/icon.ico'
-'use strict';
-
const builder = require('electron-builder');
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('./app/package.json', 'utf8'));
config: {
'appId': `org.aoichaan0513.${packageJson.name}`,
'productName': packageJson.name,
+ 'copyright': `Copyright 2019 ${packageJson.author.name}. All rights reserved.`,
'asar': true,
+ 'fileAssociations': [
+ {
+ 'name': 'Document',
+ 'description': packageJson.name,
+ 'role': 'Viewer',
+ 'ext': 'html'
+ }
+ ],
'nsis': {
'installerIcon': './static/icon.ico',
'uninstallerIcon': './static/icon.ico'
{
"name": "MyBrowser",
- "version": "1.4.7",
+ "description": "Cross-platform browser based on Chromium.",
+ "version": "1.5.2",
"private": true,
"author": {
"name": "Aoichaan0513",