Skip to content

Commit

Permalink
feat: add deviceMetricsOverride option to support #4
Browse files Browse the repository at this point in the history
  • Loading branch information
halwu(吴浩麟) committed Jul 4, 2017
1 parent 5690e8a commit 32dc966
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 5 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ see more demo in [unit test](test/index.test.js)
- `useReady`: `boolean` whether use `window.isPageReady=1` to notify chrome-render page has ready. default is false chrome-render use `domContentEventFired` as page has ready.
- `script`: `string` is an option param. inject script source to evaluate when page on load
- `renderTimeout`: `number` in ms, `render()` will throw error if html string can't be resolved after `renderTimeout`, default is 5000ms.
- `deviceMetricsOverride`: `object` overrides the values of device screen dimensions for responsive websites, detail use see [here](https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride)

all request from chrome-render will take with a HTTP header `x-chrome-render:${version}`

Expand Down
4 changes: 4 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ export default class ChromeRender {
* `number` in ms, `render()` will throw error if html string can't be resolved after `renderTimeout`, default is 5000ms.
*/
renderTimeout?: number,
/**
* `object` Overrides the values of device screen dimensions, same as https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride
*/
deviceMetricsOverride?: object,
}): Promise<string>;

/**
Expand Down
15 changes: 11 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ class ChromeRender {
* @return {Promise.<ChromeRender>}
*/
static async new(params = {}) {
const { maxTab} = params;
const { maxTab } = params;
const chromeRender = new ChromeRender();
chromeRender.chromePoll = await ChromePoll.new({
maxTab,
protocols: ['Page', 'DOM', 'Network', 'Console'],
protocols: ['Page', 'DOM', 'Network', 'Console', 'Emulation'],
});
return chromeRender;
}
Expand All @@ -42,6 +42,7 @@ class ChromeRender {
* useReady: `boolean` whether use `window.chromeRenderReady()` to notify chrome-render page has ready. default is false chrome-render use `domContentEventFired` as page has ready.
* script: inject script to evaluate when page on load
* renderTimeout: `number` in ms, `render()` will throw error if html string can't be resolved after `renderTimeout`, default is 5000ms.
* deviceMetricsOverride: `object` Overrides the values of device screen dimensions, same as https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride
* }
* @returns {Promise.<string>} page html string
*/
Expand All @@ -50,7 +51,7 @@ class ChromeRender {
return await new Promise(async (resolve, reject) => {
let hasFailed = false;
let timer;
let { url, cookies, headers = {}, useReady, script, renderTimeout = 5000 } = params;
let { url, cookies, headers = {}, useReady, script, renderTimeout = 5000, deviceMetricsOverride } = params;


// params assert
Expand All @@ -63,7 +64,7 @@ class ChromeRender {

// open a tab
client = await this.chromePoll.require();
const { Page, DOM, Console, Network, } = client.protocol;
const { Page, DOM, Console, Network, Emulation } = client.protocol;

// add timeout reject
timer = setTimeout(() => {
Expand Down Expand Up @@ -145,6 +146,12 @@ Object.defineProperty(window, 'isPageReady', {
Page.domContentEventFired(resolveHTML);
}

// override device metrics
if (deviceMetricsOverride && typeof deviceMetricsOverride === 'object') {
// https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride
Emulation.setDeviceMetricsOverride(deviceMetricsOverride);
}

// to go page
await Page.navigate({
url,
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "chrome-render",
"version": "1.1.1",
"version": "1.2.0",
"description": "General server render base on chrome",
"keywords": [
"headless",
Expand Down
30 changes: 30 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
const assert = require('assert');
const ChromeRender = require('../index');

process.on('unhandledRejection', console.trace);

describe('#ChromeRender', function () {
this.timeout(10000);

Expand Down Expand Up @@ -106,4 +108,32 @@ describe('#ChromeRender', function () {
await chromeRender.destroyRender();
});

it('#render() use mobile to visit by set deviceMetricsOverride', async function () {
const chromeRender = await ChromeRender.new();

// mobile version
let html = await chromeRender.render({
url: 'https://www.google.com',
headers: {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1',
},
deviceMetricsOverride: {
width: 100,
height: 200,
deviceScaleFactor: 0,
fitWindow: true,
mobile: true,
}
});
assert(html.indexOf('apple-touch-icon') > 0, `visit mobile version should has apple-touch-icon, html:${html}`);

// desktop version
html = await chromeRender.render({
url: 'https://www.google.com',
});
assert(html.indexOf('apple-touch-icon') === -1, `default is visit desktop version should not has apple-touch-icon, html:${html}`);

await chromeRender.destroyRender();
});

});

0 comments on commit 32dc966

Please sign in to comment.