diff --git a/browser/brave_content_browser_client.cc b/browser/brave_content_browser_client.cc index 4f349371b31..501c4cca243 100644 --- a/browser/brave_content_browser_client.cc +++ b/browser/brave_content_browser_client.cc @@ -5,6 +5,39 @@ #include "brave/browser/brave_content_browser_client.h" #include "brave/browser/brave_browser_main_extra_parts.h" +#include "brave/common/webui_url_constants.h" +#include "chrome/common/url_constants.h" +#include "content/public/browser/browser_url_handler.h" + + +namespace { + +bool HandleNewTabURLRewrite(GURL* url, + content::BrowserContext* browser_context) { + if (!url->SchemeIs(content::kChromeUIScheme) || + url->host() != chrome::kChromeUINewTabHost) + return false; + + *url = GURL(kBraveNewTabUrl); + return true; +} + +bool HandleNewTabURLReverseRewrite(GURL* url, + content::BrowserContext* browser_context) { + // Do nothing in incognito. + Profile* profile = Profile::FromBrowserContext(browser_context); + if (profile && profile->IsOffTheRecord()) + return false; + + if (url->spec() == kBraveNewTabUrl) { + *url = GURL(kBraveNewTabUrl); + return true; + } + + return false; +} + +} BraveContentBrowserClient::BraveContentBrowserClient() {} @@ -17,3 +50,10 @@ content::BrowserMainParts* BraveContentBrowserClient::CreateBrowserMainParts( main_parts->AddParts(new BraveBrowserMainExtraParts()); return main_parts; } + +void BraveContentBrowserClient::BrowserURLHandlerCreated(content::BrowserURLHandler* handler) { + // Handler to rewrite chrome://newtab + handler->AddHandlerPair(&HandleNewTabURLRewrite, + &HandleNewTabURLReverseRewrite); + ChromeContentBrowserClient::BrowserURLHandlerCreated(handler); +} diff --git a/browser/brave_content_browser_client.h b/browser/brave_content_browser_client.h index 217356744b3..8295d43248b 100644 --- a/browser/brave_content_browser_client.h +++ b/browser/brave_content_browser_client.h @@ -15,6 +15,7 @@ class BraveContentBrowserClient : public ChromeContentBrowserClient { // Overridden from ChromeContentBrowserClient: content::BrowserMainParts* CreateBrowserMainParts( const content::MainFunctionParams& parameters) override; + void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override; private: DISALLOW_COPY_AND_ASSIGN(BraveContentBrowserClient); diff --git a/browser/ui/webui/brave_web_ui_controller_factory.cc b/browser/ui/webui/brave_web_ui_controller_factory.cc index eed4e2073cc..9e0c3511f39 100644 --- a/browser/ui/webui/brave_web_ui_controller_factory.cc +++ b/browser/ui/webui/brave_web_ui_controller_factory.cc @@ -32,7 +32,7 @@ WebUIController* NewWebUI(WebUI* web_ui, const GURL& url) { if (host == kPaymentsHost) { return new BasicUI(web_ui, url.host(), kPaymentsJS, IDR_BRAVE_PAYMENTS_JS, IDR_BRAVE_PAYMENTS_HTML); - } else if (host == chrome::kChromeUINewTabHost) { + } else if (host == kBraveNewTabHost) { return new BasicUI(web_ui, url.host(), kBraveNewTabJS, IDR_BRAVE_NEW_TAB_JS, IDR_BRAVE_NEW_TAB_HTML); } else if (host == chrome::kChromeUIWelcomeHost) { @@ -48,7 +48,7 @@ WebUIController* NewWebUI(WebUI* web_ui, const GURL& url) { WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui, const GURL& url) { if (url.host_piece() == kPaymentsHost || - url.host_piece() == chrome::kChromeUINewTabHost || + url.host_piece() == kBraveNewTabHost|| url.host_piece() == chrome::kChromeUIWelcomeHost) { return &NewWebUI; } diff --git a/common/webui_url_constants.cc b/common/webui_url_constants.cc index 59f46515715..02a78e29dee 100644 --- a/common/webui_url_constants.cc +++ b/common/webui_url_constants.cc @@ -4,3 +4,5 @@ const char kPaymentsHost[] = "payments"; const char kPaymentsJS[] = "brave_payments.js"; const char kBraveNewTabJS[] = "brave_new_tab.js"; const char kWelcomeJS[] = "welcome.js"; +const char kBraveNewTabHost[] = "bravenewtab"; +const char kBraveNewTabUrl[] = "chrome://bravenewtab";; diff --git a/common/webui_url_constants.h b/common/webui_url_constants.h index d6cb8e10119..621f4165d90 100644 --- a/common/webui_url_constants.h +++ b/common/webui_url_constants.h @@ -5,6 +5,8 @@ extern const char kPaymentsHost[]; extern const char kPaymentsJS[]; extern const char kBraveNewTabJS[]; extern const char kWelcomeJS[]; +extern const char kBraveNewTabHost[]; +extern const char kBraveNewTabUrl[]; #endif // BRAVE_COMMON_URL_CONSTANTS_H_ diff --git a/components/brave_new_tab_ui/brave_new_tab.html b/components/brave_new_tab_ui/brave_new_tab.html index 2fd3966881a..85fa7140efb 100644 --- a/components/brave_new_tab_ui/brave_new_tab.html +++ b/components/brave_new_tab_ui/brave_new_tab.html @@ -5,8 +5,8 @@ New Tab - - Brave New Tab +
+ diff --git a/components/brave_new_tab_ui/brave_new_tab.js b/components/brave_new_tab_ui/brave_new_tab.js index f67142678f9..33c1c4b9255 100644 --- a/components/brave_new_tab_ui/brave_new_tab.js +++ b/components/brave_new_tab_ui/brave_new_tab.js @@ -1 +1,17 @@ +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' +import { createStore } from 'redux' +import reducers from './reducers' +import App from './components/app' + +let store = createStore(reducers) + +render( + + + , + document.getElementById('root') +) + console.log('brave_new_tab.js loaded') diff --git a/components/brave_new_tab_ui/components/app.js b/components/brave_new_tab_ui/components/app.js new file mode 100644 index 00000000000..3b4a5cd32c4 --- /dev/null +++ b/components/brave_new_tab_ui/components/app.js @@ -0,0 +1,7 @@ +import React from 'react' + +const App = () => ( +
New Tab!
+) + +export default App diff --git a/components/brave_new_tab_ui/reducers/index.js b/components/brave_new_tab_ui/reducers/index.js new file mode 100644 index 00000000000..c7fc1315add --- /dev/null +++ b/components/brave_new_tab_ui/reducers/index.js @@ -0,0 +1,8 @@ +import { combineReducers } from 'redux' +import newTabReducer from './newTabReducer' + +const combinedReducer = combineReducers({ + newTabReducer +}) + +export default combinedReducer diff --git a/components/brave_new_tab_ui/reducers/newTabReducer.js b/components/brave_new_tab_ui/reducers/newTabReducer.js new file mode 100644 index 00000000000..decfff990a7 --- /dev/null +++ b/components/brave_new_tab_ui/reducers/newTabReducer.js @@ -0,0 +1,8 @@ +const newTabReducer = (state = {}, action) => { + switch (action.type) { + default: + return state + } +} + +export default newTabReducer diff --git a/components/resources/BUILD.gn b/components/resources/BUILD.gn index aba893852d3..8c76dd6bd26 100644 --- a/components/resources/BUILD.gn +++ b/components/resources/BUILD.gn @@ -1,6 +1,34 @@ import("//printing/features/features.gni") import("//tools/grit/grit_rule.gni") + +action("transpile_web_uis") { + script = "//brave/script/transpile-web-ui.py" + inputs = [ + "../brave_new_tab_ui/brave_new_tab.html", + "../brave_new_tab_ui/brave_new_tab.js", + "../brave_payments_ui/brave_payments.html", + "../welcome_ui/welcome.html", + "../welcome_ui/welcome.js" + ] + outputs = [ + "$target_out_dir/brave_new_tab.bundle.js", + "$target_out_dir/brave_payments.bundle.js", + "$target_out_dir/welcome.bundle.js" + ] + gen_dir = rebase_path(root_gen_dir, "//") + args = [ + "--target_gen_dir=$gen_dir" + ] + if (is_official_build) { + args += [ + "--production", + ] + } +} + + + grit("brave_components_resources_grit") { source = "brave_components_resources.grd" @@ -9,6 +37,11 @@ grit("brave_components_resources_grit") { "grit/brave_components_resources.h", "brave_components_resources.pak", ] + deps = [ ":transpile_web_uis" ] + grit_flags = [ + "-E", + "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir), + ] output_dir = "$root_gen_dir/components" resource_ids = "//brave/browser/resources/resource_ids" } diff --git a/components/resources/brave_components_resources.grd b/components/resources/brave_components_resources.grd index 40e36ab0347..4e845bcf966 100644 --- a/components/resources/brave_components_resources.grd +++ b/components/resources/brave_components_resources.grd @@ -13,11 +13,13 @@ - + + - + + - + diff --git a/components/webpack/dev.config.js b/components/webpack/dev.config.js new file mode 100644 index 00000000000..90d7ede292a --- /dev/null +++ b/components/webpack/dev.config.js @@ -0,0 +1,51 @@ +const path = require('path') +const webpack = require('webpack') +const postCSSConfig = require('./postcss.config') + +module.exports = { + entry: { + brave_new_tab: path.join(__dirname, '../brave_new_tab_ui/brave_new_tab'), + welcome: path.join(__dirname, '../welcome_ui/welcome'), + brave_payments: path.join(__dirname, '../brave_payments_ui/brave_payments') + }, + output: { + path: path.join(__dirname, '..', '..', '..', process.env.TARGET_GEN_DIR, 'brave'), + filename: '[name].bundle.js', + chunkFilename: '[id].chunk.js' + }, + plugins: [ + new webpack.optimize.OccurrenceOrderPlugin(), + new webpack.IgnorePlugin(/[^/]+\/[\S]+.dev$/), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('development') + } + }) + ], + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'awesome-typescript-loader' + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/, + query: { + presets: ['react-optimize'] + } + }, { + test: /\.css$/, + loaders: [ + 'style-loader', + 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', + {loader: 'postcss-loader', options: postCSSConfig} + ] + }] + } +} + diff --git a/components/webpack/postcss.config.js b/components/webpack/postcss.config.js new file mode 100644 index 00000000000..fa6c7a172f5 --- /dev/null +++ b/components/webpack/postcss.config.js @@ -0,0 +1,4 @@ +module.exports = { + plugins: [ + ] +} diff --git a/components/webpack/prod.config.js b/components/webpack/prod.config.js new file mode 100644 index 00000000000..f45ea11f4e6 --- /dev/null +++ b/components/webpack/prod.config.js @@ -0,0 +1,56 @@ +const path = require('path') +const webpack = require('webpack') +const postCSSConfig = require('./postcss.config') + +module.exports = { + entry: { + brave_new_tab: path.join(__dirname, '../brave_new_tab_ui/brave_new_tab'), + welcome: path.join(__dirname, '../welcome_ui/welcome'), + brave_payments: path.join(__dirname, '../brave_payments_ui/brave_payments') + }, + output: { + path: path.join(__dirname, '..', '..', '..', process.env.TARGET_GEN_DIR, 'brave'), + filename: '[name].bundle.js', + chunkFilename: '[id].chunk.js' + }, + plugins: [ + new webpack.optimize.OccurrenceOrderPlugin(), + new webpack.IgnorePlugin(/[^/]+\/[\S]+.dev$/), + new webpack.optimize.UglifyJsPlugin({ + comments: false, + compressor: { + warnings: false + } + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production') + } + }) + ], + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'awesome-typescript-loader' + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/, + query: { + presets: ['react-optimize'] + } + }, { + test: /\.css$/, + loaders: [ + 'style-loader', + 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', + {loader: 'postcss-loader', options: postCSSConfig} + ] + }] + } +} diff --git a/patches/chrome-browser-chrome_content_browser_client.cc.patch b/patches/chrome-browser-chrome_content_browser_client.cc.patch deleted file mode 100644 index ef6022162df..00000000000 --- a/patches/chrome-browser-chrome_content_browser_client.cc.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc -index 7eb6ac81040172c0739e62b3140120099ca32ffb..ca5bd3cc71109c5968b963da3e431170ee307e2e 100644 ---- a/chrome/browser/chrome_content_browser_client.cc -+++ b/chrome/browser/chrome_content_browser_client.cc -@@ -2673,10 +2673,6 @@ void ChromeContentBrowserClient::BrowserURLHandlerCreated( - // Handler to rewrite chrome://newtab on Android. - handler->AddHandlerPair(&chrome::android::HandleAndroidNativePageURL, - BrowserURLHandler::null_handler()); --#else -- // Handler to rewrite chrome://newtab for InstantExtended. -- handler->AddHandlerPair(&search::HandleNewTabURLRewrite, -- &search::HandleNewTabURLReverseRewrite); - #endif - - // chrome: & friends. diff --git a/script/transpile-web-ui.py b/script/transpile-web-ui.py new file mode 100755 index 00000000000..3561a085194 --- /dev/null +++ b/script/transpile-web-ui.py @@ -0,0 +1,42 @@ + +import argparse +import os +import sys +from lib.util import execute_stdout, scoped_cwd + +NPM = 'npm' +if sys.platform in ['win32', 'cygwin']: + NPM += '.cmd' + +def main(): + args = parse_args() + update_node_modules('.', args.production, args.target_gen_dir[0]) + + +def parse_args(): + parser = argparse.ArgumentParser(description='Transpile web-uis') + parser.add_argument('-p', '--production', + action='store_true', + help='Uses production config') + parser.add_argument('--target_gen_dir', + nargs=1) + return parser.parse_args() + + +def update_node_modules(dirname, production, target_gen_dir, env=None): + if env is None: + env = os.environ.copy() + + if production: + args = [NPM, 'run', 'web-ui'] + else: + args = [NPM, 'run', 'web-ui-dev'] + + env["TARGET_GEN_DIR"] = target_gen_dir + with scoped_cwd(dirname): + execute_stdout(args, env) + +if __name__ == '__main__': + sys.exit(main()) + +