軽率に更新したChromeから横幅ハラスメントを受けて鬱になるも、立ち直るに至るまでの記録

公開日:2019-03-23
最終更新:2019-04-03

概要とか経緯

  • GoogleChromeでソシャゲプレイという、やや特殊?な使い方をしている
  • 横幅を縮めて遊びたい
  • いつかのバージョンから、最小幅上限が変更され、横幅が増えた
  • 当時、この幅を縮める方法があった
  • ..が、v73 あたりでそれも使えなくなった模様・・・病む・・・
  • 鬱になったので(誇張)、ダウングレード以外で何とかできないかと調べ始める
  • 身近な所だと、多分グラブルでこれをやりたい人も居そう
  • あっ自分はモバマスの民です

執筆時のバージョン:73.0.3683.86 , Official Build , x64

注意

  • 自己責任でオナシャスです
  • UA偽装が前提ですが、ここでは特に触れません。
  • Chromium だと横幅に影響が出ませんでした(縮小失敗)
  • Vivaldi も試してないけど出来ない気がする

先に結論

  • 神ツール chrome-pak-customizer をDL
  • 言語パック ja.pak を書き換える
  • 鬱が完治!!!!ハッピー!!!!

手順

chrome-pak-customizer 入手 / 展開

作者(myfreeer)氏に感謝しながら、GitHubでDL
https://github.com/myfreeer/chrome-pak-customizer/releases

ページ内に Release という項目がいくつかあるので、そのなかの Assets から、
chrome-pak.7z をダウンロードして展開。
.7z 形式はアーカイブ(zip等の圧縮ファイルと同系列)なので、開けない場合は 別途解凍ツールを探してください

Chrome 内 Locales フォルダから ja.pak を見つける

インストール済みのChrome本体が置かれた場所をPCから探してください。
人によって異なると思いますが、自分はおおよそ以下の場所にインストールされていました。

C:\Program Files (x86)\Google\Chrome

さらにそこから言語に関するフォルダ Locales があるので、その中から ja.pak を探します。

C:\Program Files (x86)\Google\Chrome\Application\[version値]\Locales

編集時、アクセス権限の関係があるので、一度デスクトップなどの場所に ja.pak をコピーして、そこで作業をしてください。
念のため、/Locales フォルダ内に ja.pak.bak といった風に、名前を変えたファイルをバックアップしておきましょう。最悪破損しても、そのファイルをコピーして ja.pak に名前を戻せば元のファイルとして使えます

unpack.bat で展開(unpack)

chrome-pak.7z 本体を展開すると出てくる unpack.bat に、ja.pak をドラッグ&ドロップします
暫くすると、新しいフォルダが生成され、その中にja.pakの中身一覧が展開され(unpackされ)ます。

フォルダ内から、当該ファイルを見つけて編集

upnackされたフォルダの中を見ると、数字のついた大量のファイルがあります。
これらはメモ帳などのテキストエディタに突っ込むと中身が見られるので、それを応用して目的のファイルを書き換えます。

結論から言えば 「保護されていない通信」という文字列を除去することで、本記事の議題に沿った形で横幅を縮められる ので、それが書いてあるファイルを探すことになります。

Chromeのバージョンによってファイル番号が(場合によっては構成も)異なりますが、およそ 15534 前後のファイルを探すと良いでしょう。連番の中で .json ファイルが2つ連なっている箇所をさかのぼっていく形が目印になるかもしれません。
(※ v 73.0.3683.86(Official Build) x64 の時)

unpack後のフォルダから見つけるための構成メモ

探しやすいように、ほぼ連番、前後関係を保持していると思うメモを置いておきますが、過信禁物です。
1行ごとの内容なので、開いたファイルとこのメモを見比べて、同じ内容があれば推測で範囲を絞り込んでいってください。

最近アクセスしたブックマークがここに表示されます  
周辺  
周辺のおすすめの場所がここに表示されます  
リーディング リスト  
リーディング リストに登録されたページがここに表示されます  
最近開いたタブがここに表示されます  
公開元: $1。この記事と他 $2 件の記事を読むことができます。  
$1 検索  
コピーしたリンク  
コピーしたテキスト  
「$1」  
コピーした画像  
$1 で画像を検索  
$1 [$2]  
保護された通信  
# ↓↓↓↓【※】このファイルを見つけてください  
保護されていない通信    
# ↑↑↑↑【※】このファイルを見つけてください  
危険  
オフライン  
このタブに切り替え  
切り替え  
フィジカル ウェブからの URL  
【※.json】{URL_count,plural, =1{他 1 件のウェブページ}other{他 # 件のウェブページ}}  
【※.json】{URL_count,plural, =1{1 件の近くのウェブページ}other{# 件の近くのウェブページ}}  

当該ファイルの編集

「保護されていない通信」が書かれたファイルを特定したら、メモ帳といったテキストエディタで編集し、

保護されていない通信

の文字列を丸ごと消して、空のテキストにした後、上書き保存します。
一応文字コードは UTF-8 なので、少しだけ気にかけておくとトラブル防止になるかもしれません

pack.bat で 再pack化して pak_index_packed.pak を生成

当該ファイルの編集を終えたら、unpack したフォルダの中(多分一番下)にある、pak_index.ini ファイルを pack.bat にドラッグ&ドロップします。
暫くすると、pak_index_packed.pak というファイルがフォルダの中に新しく作成されています。

この pak_index_packed.pak が中身の編集された言語パック..つまり ja.pak(編集済) に相当するので、元の ja.pak と置き換えて運用します

Chromeを終了させて、ja.pak を置き換える

先程生成した pak_index_packed.pakja.pak にリネームして、GoogleChromeを全て終了させた後、/Locale フォルダに元々あった ja.pak に上書きするなどして置き換えてください

置き換え後、Chromeを起動しなおすと多分表示が消えているんじゃないかなと思います。

楽しいポチポチソシャゲライフ

欲を言えばもう少し横幅縮まってほしい所ですが、とりあえず立ち直れました、というお話でした。

↑手順だけ知りたい人用の項目ここまで↑

以降は、過去の手法に言及したり、別のアプローチ方法だったり、Chromiumのソースコードに関する知見・メモとなります。



過去の状況

ソシャゲプレイにあたり

昨今のソシャゲはクライアント型ゲームが主流な気はしますが、こと自分に於いてはUA偽装で遊べるブラウザポチポチゲーというのが前提。
FirefoxやEdgeをメインにして、態々Chromeをゲーム用のみとして使っている人も居るらしい。
ただ、Chromeは複数ユーザーとして同時に立ち上げられる機能を持っているわけだけど、一々そこまで気にしない人が多いのかもしれない。
自分は自作拡張機能(GoogleChromeExtension)を使う事が前提だったので、Chromiumベースに拘わり、メインブラウザ、ゲーム用共に別ユーザーで立ち上げたChromeを同時起動させて遊んでいます。

画像:Chromeから横幅ハラスメントを受けている様

(つまりこれ以上横幅を縮められない)

単純に横幅が縮まれば良いのなら

メニュー > その他のツール > ショートカットを作成
そこからウィンドウとして開く にチェックを入れると、ショートカットがデスクトップに生成されます。

後はここから起動すれば、横幅も相当縮められる。
ただし、これだとタブやブックマークが使えない...が、逆に気にならない人はこれだけで十分かもしれませんね。
(拡張機能もアクセスできます)

画像:お手軽横幅制限解除するとこんな感じ

従来の手法等

いつだったか、RTで回ってきたツイートで知ったのですが、斯様な対処法がありました

過去の対策 / 設定項目

英語はさっぱりなので、ググる先生に適当に翻訳

UI Layout for the browser’s top chrome

#top-chrome-md

Toggles between
1) Normal – for clamshell devices
2) Hybrid (previously touch) – middle point for devices with a touch screen
3) Touchable – new unified interface for touch and convertibles (Chrome OS)
4) Material Design refresh and
5) Touchable Material Design refresh.
Enabling #upcoming-ui-features forces the Material Design refresh option. – Mac, Windows, Linux, Chrome OS

Chrome上部のUIレイアウト切り替え
1) ノーマル - クラムシェルデバイス用
2) ハイブリッド(以前はタッチ) - タッチスクリーンを備えたデバイス用のミドルポイント
3) タッチ可能 - タッチとコンバーチブル用の新しい統一インターフェース(Chrome OS)
4) マテリアルデザインの更新
5) タッチ可能 - マテリアルデザインの更新

#upcoming-ui-featuresを有効にすると、Material Designの更新オプションが強制されます。 - Mac、Windows、Linux、Chrome OS

Mark non-secure origins as non-secure

#enable-mark-http-as

Mark non-secure origins as non-secure
Change the UI treatment for HTTP pages – Mac, Windows, Linux, Chrome OS, Android

安全でないものを安全でないものとしてマークする
HTTPページのUI処理を変更する - Mac、Windows、Linux、Chrome OS、Android

過去の対策 / 当時の改善

横幅が広がる原因は、https通信かそうでないかによるところが大きいです。
http通信の場合、ブラウザ上で「保護されていない通信」と表示されてしまい、この強制的なメッセージ領域が幅を取り、ブラウザ幅縮小の妨げとなっていました。

以前は enable-mark-http-asDisabled にすることで、この「保護されていない通信」の表示をまるまる非表示にすることが出来ました。

しかしながら、執筆時のバージョンでこれを弄るも、「保護されていない通信」が出たまんま..(´・ω・`)
単純に Chrome側の(放置中)バグか、あるいは置き換わった仕様なのかな?と思いました

まったく実用的ではないが、即座に縮められる方法も

URLバー(検索バー)の文字列を選択し、消しておくことで横幅を一時的に縮めることができます。
ですが、ページ遷移などで再びURLバーに文字列が入った状態でウィンドウを移動させたり、最小化→元のサイズに戻す 等のアクションで、強制的に横幅が戻ります。 正直実用的ではありません...

ちなみに、GoogleChrome的には、この「URLおよび検索の入力機能が合わさったフォーム」の事を オムニボックス(Omnibox) と呼ぶらしいです。

画像:オムニボックスの中身を手動で一々消すというフラストレーションライフ

文字列を消せば非表示になるのでは?

バイナリでナル文字埋め

「保護されていない通信」を司る箇所を見つけ、そこをバイナリで弄る事で、文字列を消す..つまり横幅を減らせないかと考えました。

Locales フォルダにある ja.pak ファイルが該当すると特定し、バイナリエディタで当該箇所を 00 でパディング。
すると、文字列は確かに消えるのですが、横幅に変更はありませんでした。

遊んでみたいという奇特な方がいるかもしれませんので、手法を残します

C:\Program Files (x86)\Google\Chrome\Application\[version値]\Locales
あたりから、ja.pak を見つける
(人によってはChromeのインストール場所が異なるかもしれません)

"保護されていない通信" をUTF-8 でバイナリに変換
E4 BF 9D E8 AD B7 E3 81 95 E3 82 8C E3 81 A6 E3 81 84 E3 81 AA E3 81 84 E9 80 9A E4 BF A1

ja.pak をバイナリエディタで開き、そのまんま
E4BF9DE8ADB7E38195E3828CE381A6E38184E381AAE38184E9809AE4BFA1
でデータ検索。 (文字化けしてると思うので、こっちが楽です)

1件ヒットするので、00で埋めて上書き (Chromeは終了させておくこと)

しかし、この「文字列を消す」という読み自体は正しく、このファイルを正規?の方法で編集することで解決できた..というのが、冒頭に書いた手順記事です。

Chromiumビルドする...?

Chromimuを開き、オンラインでひたすらソース検索し、怪しそうな箇所を何時間もかけて調べましたが、そもそも
ビルドのハードルが物凄く高く感じたので、断念。 高水準スペックのWindowsでビルドしても、半日かかるとか...汗

また、Linux等(見かけたところによるとUbunth推奨?)でやっても、6時間くらいは要してしまうらしいです。

あとそもそも自分はLinuxサッパリなんで、ビルドの解説記事を見て速攻委縮しました。

とはいえ、いつか自分でビルドで来たらいいなぁという意味も込めて、それっぽい所のメモを残しておきます

The Chromium Projects
本家プロジェクトのURL

Code Search
Chromium のソースがオンラインで検索できる。
ちょっと眺めるくらいなら、いちいちソースを引っ張ってこなくても良さそう

関係してそうだな、と思った箇所

location_icon_view.h

//src/chrome/browser/ui/views/location_bar/location_icon_view.h

Returns text to be placed in the view.

  • For secure/insecure pages, returns text describing the URL's security level.
  • For extension URLs, returns the extension name.
  • For chrome:// URLs, returns the short product name (e.g. Chrome).
  • For file:// URLs, returns the text "File".

ビューに配置するテキストを返します。

  • 安全で安全でないページの場合、URLのセキュリティレベルを説明するテキストを返します
  • 拡張子URLの場合は、拡張子名を返します。
  • chrome:// URLの場合は、短い製品名(Chromeなど)を返します。
  • file:// URLの場合、テキスト「File」を返します。

このメソッドが「保護されていない通信」といった文字列を返す役割を担っていそう

base::string16 GetText() const;  

location_icon_view.cc

//src/chrome/browser/ui/views/location_bar/location_icon_view.cc

On ChromeOS, this can be called using web_contents from
SimpleWebViewDialog::GetWebContents() which always returns null.
TODO( crbug.com/680329 ) Remove the null check and make
SimpleWebViewDialog::GetWebContents return the proper web contents instead.

ChromeOSでは、SimpleWebViewDialog :: GetWebContents()の
web_contentsを使用して呼び出すことができます。これは常にnullを返します。
TODO( crbug.com/680329 )nullチェックを削除し、
代わりにSimpleWebViewDialog :: GetWebContentsが
適切なWebコンテンツを返すようにします。

多分このメソッドを弄れば...?

base::string16 LocationIconView::GetText() const {  
 //"Chrome" に相当する文字列を返す?  
 if (delegate_->GetLocationBarModel()->GetURL().SchemeIs(content::kChromeUIScheme))  
  return l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME);  

 //"ファイル" に相当する文字列を返す?  
 if (delegate_->GetLocationBarModel()->GetURL().SchemeIs(url::kFileScheme))  
  return l10n_util::GetStringUTF16(IDS_OMNIBOX_FILE);  

 //"Chrome" に相当する文字列を返す?  
 if (delegate_->GetWebContents()) {  
  const base::string16 extension_name =  
   extensions::ui_util::GetEnabledExtensionNameForUrl(  
    delegate_->GetLocationBarModel()->GetURL(),  
    delegate_->GetWebContents()->GetBrowserContext());  
   if (!extension_name.empty())  
    return extension_name;  
 }  

 //"保護されたコンテンツ" , "保護されていない通信" 等の文字列を返す?  
 return delegate_->GetLocationBarModel()->GetSecureDisplayText();  
}  

location_icon_view.cc

//src/chrome/browser/ui/views/location_bar/location_icon_view.cc

GetMinimumLabelTextWidth() というあまりにもそれっぽい名前
文字列に応じた横幅の長さを返しているものと予想

Optimize this common case by not creating a new label.
GetPreferredSize is not dependent on the label's current
width, so this returns the same value as the branch below.

新しいラベルを作成しないことで、この一般的なケースを最適化します。
GetPreferredSizeはラベルの現在の値に依存しません
widthなので、これは以下のブランチと同じ値を返します。

LocationIconView:: という名前も相まって、ここも関係してそうな気がしました

int LocationIconView::GetMinimumLabelTextWidth() const {  
  int width = 0;  

  base::string16 text = GetText();  
  if (text == label()->text()) {  

    width = label()->GetPreferredSize().width();  
  } else {  
    views::Label label(text, {font_list()});  
    width = label.GetPreferredSize().width();  
  }  
  return GetMinimumSizeForPreferredSize(GetSizeForLabelWidth(width)).width();  
}  

おわりに

今後また、Chromeアプデ後の #enable-mark-http-as の Disabled で、再びメッセージが消えたりしないかな~とか淡い期待を寄せています。 (バグであってほしい)  
まぁそれが無理でも、当面は ja.pak を書き換えるだけで事足りるでしょう。 Chromium 弄り倒せるようになったら一番楽しそうなのですが、今の自分にとっては、それがあるとしても随分先の話になると思います。

Chromium のビルドハードルがあんなに高いなんて思いませんでした;;

この記事が、あなたの快適ポチポチソシャゲライフに繋がれば幸いです

記事が少しでもいいなと思ったらクラップを送ってみよう!
46
+1
ひげさんのチラ裏だったりカンニングペーパーだったり学習ノートだったりする所です。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする