Chromeブラウザのトップサイトを変更する

近年 Netflix や DAZN と言ったストリーミング配信サービスが充実してきました。開発環境では Safari ブラウザを使っていますがこれら動画配信系のサービスを利用するとエラーを起こして止まってしまうことがよくあったので Google Chrome ブラウザを使用することにしています。その際に、Google Chrome ブラウザで新規タブを開いた時の「起動ページ」に表示されている8つのページリンクのサムネール、これを Safari ブラウザでは「トップサイト」と呼んでいてドラッグ&ドロップのマウス操作で追加操作ができるものの、Chrome ではページの読み込み回数でのみの判定となっていて且つ期待した様に追加ができないという挙動があったので調べてみました。

まず辿り着いた StackExchange では、Chrome のデータファイル Preferences に記述されている locations の値を編集すれば良いということが分かったので、macOS でのファイルパス ~/Library/Application Support/Google/Chrome/Default に移動して探してみたところ、該当する値がありませんでした。そこで回答の2つ目を見ると、2012年にリリースしたバージョン 17.0.963.56 以降の Chrome ブラウザは Preferences テキストファイルの記述によるデータ管理を止めて SQLite に変更したことが分かりました。

同じ Default 内に Top Sites という拡張子の無いファイルがあったので DB Browser for SQLite で開いて見ると thumbnails テーブルにずらずらと該当データが保存してありました。

url_rank 項目の値順に左上から並ぶことになっていると推測できるのですが、この状態でもトップサイトにサムネールが表示されないのは問題です。

http://hkitago.tumblr.com/post/164159265281

この理由は、トップサイトの各サムネールをマウスオーバーすることで表示される右上の「バツボタン」を押し消去すると Preferences JSON ファイルの most_visited_blacklist キーに MD5ハッシュで短縮した redirects 項目にある URL の値を格納し、起動ページを表示する度に参照していることが原因でした。現時点(バージョン 61.0.3163.39)でこの仕様ですと、過去によく閲覧してトップページに表示されていたサムネールでも、一旦バツボタンを押して消去してしまうと再びトップサイトに加えることができないというもので、実際に DAZN のサムネールはあったのですが、まだコンテンツが不足していたことからアカウントを作成しなかったのでバツボタンを押してサムネールを消去していました。

ということで SQLite データはそのままに、Preferences JSON ファイルを TextWrangler で most_visited_blacklist":{} と編集し保存、Chrome の起動ページに8つのサムネールの表示を確認し、改めて表示させないサムネールのバツボタンを押しました。ただ、DAZN サムネールの画像が表示されておらず SQLite データを確認したところ、 thumbnails テーブルの thumbnails 項目が NULL となっていたため、適当に画面のスクリーンショットを 424×284ピクセルの JPEG データに変換して BLOB データとして格納しました。

「利用頻度の高いトップサイトに表示させたくないから二度と現れることがないブラックリスト行き」という設計は如何なものかとは思いますが、データの移行からと思われる url_rank 項目の値に -1 を持っているものもあったりと、今後の改善に期待したいところです。

参考:

ポップアップするステータスバー表示を止める

Google Chrome ブラウザをフルスクリーンモードやプレゼンテーションモードで使用していると、リンクにマウスを乗せた際、画面左下にポップアップするステータスバーが表示されるのだけど、プレゼン資料用スライドショーアプリを使う場合など、これを表示しないようにする必要があり方法について検討しました。

スクリーンショット 2016-04-25 10.25.56

解決策は非常に簡単で、A タグに href 属性を与えないということでした。

window.addEventListener('load', function() {
	var aNodes = document.getElementsByTagName('a');
	for (var i = 0, max = aNodes.length; i < max; i++){
		aNodes[i].removeAttribute('href');
	}
}, false);

もちろん、マウスを乗せた場合に形状は変えたいという状況には、a:hover {cursor:pointer;} とスタイルを設定することで対応ができます。

元々のリンク遷移を生かしたい場合も、A ノードのループ処理内で aNodes[i].onclick = "location.href='" + aNodes[i].getAttribute('href') + "'"; と先に処理を入れると良いかと思います。フレーム処理している場合は target 属性の付与が必要になるのでご注意。

P.S. 最近は 直前に記述するので window.addEventListener が不要なことが増えました。

Chromeのブックマークバーにショートカットを当てる機能拡張

OS X で Safari をメインブラウザとして使っていた理由の一つに、コマンド+数字というショートカットでブックマークバーの項目を呼び出せることがあったのだけど、次のバージョンの開発プレビュー版に更新してから暫くこのショートカットが Chrome のようにタブを呼び出すようになってしまったことに加え、SafariDAVClient が暴走するという正式リリース前にはよくある問題に直面し、更にグレードダウンもできないということから、既定のブラウザを Chrome にし、ブックマークバー(Safari では「お気に入りバー」という)に並ぶブックマークレットをショートカットで呼び出す機能拡張を自作することにした。

http://hkitago.tumblr.com/post/123624450876


(この機能設定はようやく v9 10601.1.50 Seed 5で実装された)

実際にマニュフェストファイル(manifest.json)と本体の JavaScript ファイル(background.js)はこのようなものを書いた。

{
    "name": "Bookmarks Bar Launcher",
    "version": "1",
    "manifest_version": 2,
    "permissions": [
    "bookmarks",
    "tabs",
    "<all_urls>"
  ],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
  },
    "commands": {
        "bblCommand1": {
            "suggested_key": {
                "default": "Ctrl+1",
                "mac": "Command+1"
            },
            "description": "Item 1"
        },
        "bblCommand2": {
            "suggested_key": {
                "default": "Ctrl+2",
                "mac": "Command+2"
            },
            "description": "Item 2"
        },
        "bblCommand3": {
            "suggested_key": {
                "default": "Ctrl+3",
                "mac": "Command+3"
            },
            "description": "Item 3"
        },
        "bblCommand4": {
            "suggested_key": {
                "default": "Ctrl+4",
                "mac": "Command+4"
            },
            "description": "Item 4"
        }
    }
}
chrome.commands.onCommand.addListener(function(command) {
	var url;
	switch(command) {
		case 'bblCommand1': url = url_items[0]; break;
		case 'bblCommand2': url = url_items[1]; break;
		case 'bblCommand3': url = url_items[2]; break;
		case 'bblCommand4': url = url_items[3]; break;
	}
	if((/^javascript:/).test(url)) {
		url = url.replace(/javascript:/g, '');
		chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
			chrome.tabs.executeScript(tabs[0].id, {code: decodeURI(url)});
		});	
	} else {
		window.open(url);	
	}
});
var url_items = new Array();
chrome.bookmarks.getTree(process_bookmark);
function process_bookmark(bookmarks) {
	for(var i = 0; i < bookmarks.length; i++) {
		var bookmark = bookmarks[i];
		if(bookmark.url && (bookmark.url).indexOf('chrome://bookmarks/')) {
			url_items.push(bookmark.url);
		}
		if(bookmark.children) {
			process_bookmark(bookmark.children);
		}
	}
	url_items.splice(4);
}

参考したスタックオーバーフローで知ったのだけど、Google Chrome Extension では最大4つまでしかコマンドを上書きできないそうで、Safari では1〜9までのショートカットになるところを、今回は1〜4までとなってしまった。左手でのショートカットキー操作を考えるとそれでも良いかなという気もしたので、名前を変えた同様の機能拡張を2つ用意することは止めておいた。

また、頻繁に利用する4つ共にブックマークレットを使うことから単に window.open しないで chrome.tabs.executeScript と振り分けをするところが肝。更にブックマークバーの初期状態では先頭に Bookmark という項目があるのでそれをスキップする処理も入れた。今のところの問題は、ブラウザを最初に起動した時に限りこの機能を読み込むので、起動中ブックマークバーの項目を入れ替えた場合に順序の整合性が取れない点にあるのでご注意。

最後に、この機能拡張を利用するには適当な場所にフォルダを作成し2つのファイルを保存した後、Chrome の環境設定>機能拡張と進み、右上の「デベロッパーモード」にチェックを入れると表示される「パッケージ化されていない機能拡張を読み込む…」ボタンを押し、先のフォルダを選択する。
スクリーンショット 2015-08-20 10.19.17

ここまでやってみてうまく動かない場合は、機能拡張環境設定画面の最下方右にある「キーボードショートカット」というリンクをクリックすると、改めてお好みのショートカットを割り当てることができるので設定すると良い。
スクリーンショット 2015-08-20 10.20.50

面倒臭いからパッケージ化された .crx ファイルをよこせ!という方がいらしたら遠慮なくご連絡ください。

http://hkitago.tumblr.com/post/124450780756

P.S. ちなみにウィンドウズ版でも動作することを確認していますが、Safari 体験が少ないと思うので手厚いサポートは遠慮したいところです笑

参考:

ChromeからSafariで開くサービスメニュー

Google リーダーの終了に伴って Feedly へ移行することにしたのだけど、元々このサービスは Google Chrome の機能拡張を主に構築されていたことや、OS X のアップグレードを前に Safari が大分もっさりしていることなどから、開発用途でもあるデフォルトブラウザを Safari にしつつもニュースリーダーとして Google Chrome を使う事にした。ところがページロールがあり広告だらけな長めの読み物を見る時にはどうしても Safari のリーダー機能を使いたくなる時があって、いちいちアドレスバーの文字列をコピペして移動するのは面倒なので表題のものを Automator で作る事にした。

作るのは至って簡単な数分の作業です。

  1. Automator を起動し、ファイル>新規>サービス というメニューコマンドをクリックしたら選択ボタンを押します。
  2. “サービス”は、次の項目を受け取ります:入力なし/検索対象:Google Chrome.app とします。
  3. 左側のパネルにある “AppleScript を実行” というアクションを右側のパネルにドロップし gist:5575774 をコピペします。
  4. “Safariで開く”というような適当な名前を付けて保存します。(保存先と拡張子は Automator にお任せ)

そうすると、Google Chrome を前面に持ってきた際に「Chrome>サービス>Safariで開く」というメニューコマンドが確認できるようになります。(本来は副クリックでも表示できれば良いのですが、Google Chrome がその機能を書き換えてしまっているのでちょっと不便ですねえ。)

加えて参考リンクにも解説されているように、各サービスには独自のショートカットキーを割り当てられるので「>システム環境設定>キーボード>サービス」と進み、スクロール下方の一般カテゴリに先ほど作成したサービス名が見えると思うので他と衝突しないキーの組み合わせを割り当てます。例では「コマンド+シフト+O」としていますが、ドックにウィンドウが入ってた場合に隠し機能でもあるゆっくりとしたアニメーション効果がイラッとする場合があるのでシフトキーを使わないようにすると良いかと思います。(このスローアニメーションをオフにする方法は現在無いようで…)

スクリーンショット 2013-06-29 4.39.44

そうしてる内にもこんな知らせを受けて、ジェスチャーにもキーにも対応している Reeder へ戻る羽目になりそうな予感です。

参考:

Chrome for Mac version 5.0.342.7のクラッシュ問題

次のツイートの補足をBlackbird Pie — Twitter Mediaの実験を兼ねて投稿します。


Mac OS X  10.6.3のファインダーで Dock 以外の反応が無くなったと思い、Option + 右クリックで “再度開く” を選択したところ、次の様な珍しいエラーを出力し、どのアプリも Dock から応答しなくなったので物理ボタンによる強制再起動となった。


コンソールを調べると、Dockの “LaunchServices” が反応しなくなる直前に次の様な出力の固まりが二度現れていた。

May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1067) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1067) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1070) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1068) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(4971) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(6061) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1071) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1072) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1068) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(4971) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1069) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(5971) deny mach-lookup com.apple.system.logger
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(6061) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1071) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1072) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1070) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(1069) deny mach-lookup com.apple.CoreServices.coreservicesd
May 17 10:25:12 host sandboxd[6109]: Google Chrome He(5971) deny mach-lookup com.apple.CoreServices.coreservicesd

このエラーについて調べていると同様に Google Chrome がクラッシュしたという報告があった。


どうやら “QSB Mac” という Google Code にホスティングされている検索フレームワークを Chrome が採用していて、それが悪さをしているのではないか、という話。Chromeのウィンドウを Dock に格納していたのが問題を複雑にしたような気もするが、参考までに以下がそのプロジェクトサイト。

それでも常時起動で一週間以上経っていたと思うので、もちろん他の要因との重なりなどあるかもしれない。
またこの件以来、Parallels DesktopでWin XP版の常時起動を試しているけど問題はない。

P.S. ベータって適当に落ちるね。(・∀・)

追記(5/24):
2度目のクラッシュに遭ったのでログを確認したところ、凡そ6日か丁度一週間くらいで発生している模様。こまめに終了するようにします。