Fix peertube with google bot
authorChocobozzz <me@florianbigard.com>
Fri, 18 May 2018 09:02:40 +0000 (11:02 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 22 May 2018 07:17:20 +0000 (09:17 +0200)
client/e2e/protractor.conf.js
client/e2e/src/po/login.po.ts
client/e2e/src/po/video-watch.po.ts
client/e2e/src/videos.e2e-spec.ts
client/package.json
client/src/app/core/auth/auth.service.ts
client/src/app/shared/misc/utils.ts
client/src/assets/player/peertube-player.ts
client/src/standalone/videos/embed.ts
client/yarn.lock
config/test.yaml

index 82daa435ef42409dc9da0566127c8c5cce7d8721..7b5f8de431e4cf468c22e8aa8beb467510029dcc 100644 (file)
@@ -10,14 +10,42 @@ exports.config = {
   ],
 
   seleniumAddress: 'http://hub-cloud.browserstack.com/wd/hub',
-  capabilities: {
+  commonCapabilities: {
     'browserstack.user': process.env.BROWSERSTACK_USER,
     'browserstack.key': process.env.BROWSERSTACK_KEY,
-    'browserName': 'chrome',
     'browserstack.local': true,
     'project': 'PeerTube'
   },
 
+  multiCapabilities: [
+    {
+      browserName: 'Chrome',
+      version: '66'
+    },
+    {
+      browserName: 'Chrome',
+      version: '66',
+      os: 'android',
+
+    },
+    {
+      browserName: 'Safari',
+      version: '11.1'
+    },
+    {
+      browserName: 'Firefox',
+      version: '52' // ESR
+    },
+    {
+      browserName: 'Firefox',
+      version: '60'
+    },
+    {
+      browserName: 'Edge',
+      version: '17'
+    }
+  ],
+
   maxSessions: 1,
   baseUrl: 'http://localhost:4200/',
   framework: 'jasmine',
@@ -34,3 +62,7 @@ exports.config = {
     jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}}))
   }
 }
+
+exports.config.multiCapabilities.forEach(function (caps) {
+  for (var i in exports.config.commonCapabilities) caps[i] = caps[i] || exports.config.commonCapabilities[i]
+})
index ada52cb24d18580d21af8996e880d98b270aa8f8..5a36fd611f4c731f7c076d3c6669e0f28a8819e4 100644 (file)
@@ -4,8 +4,8 @@ export class LoginPage {
   async loginAsRootUser () {
     await browser.get('/login')
 
-    element(by.css('input#username')).sendKeys('root')
-    element(by.css('input#password')).sendKeys('test1')
+    await element(by.css('input#username')).sendKeys('root')
+    await element(by.css('input#password')).sendKeys('test1')
 
     await element(by.css('form input[type=submit]')).click()
 
index 266c9850c4e9f2676f40305aff86365be904f836..b5df1cbc529a8709a694cdff2e690f42d5bce2c1 100644 (file)
@@ -24,15 +24,19 @@ export class VideoWatchPage {
       .then(seconds => parseInt(seconds, 10))
   }
 
-  async pauseVideo () {
-    const el = element(by.css('video'))
+  async pauseVideo (pauseAfterMs: number) {
+    await browser.wait(browser.ExpectedConditions.invisibilityOf(element(by.css('.vjs-loading-spinner'))))
+
+    const el = element(by.css('div.video-js'))
     await browser.wait(browser.ExpectedConditions.elementToBeClickable(el))
 
+    await browser.sleep(pauseAfterMs)
+
     return el.click()
   }
 
-  async clickOnFirstVideoOfList () {
-    const video = element(by.css('.videos .video-miniature:first-child .video-thumbnail'))
+  async clickOnVideo (videoName: string) {
+    const video = element(by.css('.videos .video-miniature .video-thumbnail[title="' + videoName + '"]'))
 
     await video.click()
 
index 4205fd7a4b4929fefe5e8d140227065b24a2d42e..82cea72b127de459b68171ef054a04789c393e4c 100644 (file)
@@ -34,15 +34,13 @@ describe('Videos workflow', () => {
   })
 
   it('Should go on video watch page', async () => {
-    await videoWatchPage.clickOnFirstVideoOfList()
+    await videoWatchPage.clickOnVideo(videoName)
 
     return videoWatchPage.waitWatchVideoName(videoName)
   })
 
   it('Should play the video', async () => {
-    await browser.sleep(4000)
-
-    await videoWatchPage.pauseVideo()
+    await videoWatchPage.pauseVideo(2500)
     expect(videoWatchPage.getWatchVideoPlayerCurrentTime()).toBeGreaterThanOrEqual(2)
   })
 })
index 393a4b13472ad28880f5e28804d5af3897b7f9a6..7a69d1a43cd712116be483762a36318d4d02aed9 100644 (file)
@@ -23,7 +23,8 @@
   },
   "license": "GPLv3",
   "resolutions": {
-    "videojs-dock/video.js": "^6"
+    "videojs-dock/video.js": "^6",
+    "webtorrent/create-torrent/junk": "^1"
   },
   "devDependencies": {
     "@angular-devkit/build-angular": "~0.6.1",
     "webpack-bundle-analyzer": "^2.9.1",
     "webpack-cli": "^2.0.14",
     "webtorrent": "^0.98.0",
+    "whatwg-fetch": "^2.0.4",
     "zone.js": "~0.8.5"
   },
   "dependencies": {
index 4b388d7be09097f7e03cd5b3b53693febc0b2fb8..4213da20c065211f2468d23a4149d726dcb80be3 100644 (file)
@@ -11,6 +11,7 @@ import { environment } from '../../../environments/environment'
 import { RestExtractor } from '../../shared/rest'
 import { AuthStatus } from './auth-status.model'
 import { AuthUser } from './auth-user.model'
+import { objectToUrlEncoded } from '@app/shared/misc/utils'
 
 interface UserLoginWithUsername extends UserLogin {
   access_token: string
@@ -113,17 +114,18 @@ export class AuthService {
 
   login (username: string, password: string) {
     // Form url encoded
-    const body = new URLSearchParams()
-    body.set('client_id', this.clientId)
-    body.set('client_secret', this.clientSecret)
-    body.set('response_type', 'code')
-    body.set('grant_type', 'password')
-    body.set('scope', 'upload')
-    body.set('username', username)
-    body.set('password', password)
+    const body = {
+      client_id: this.clientId,
+      client_secret: this.clientSecret,
+      response_type: 'code',
+      grant_type: 'password',
+      scope: 'upload',
+      username,
+      password
+  }
 
     const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded')
-    return this.http.post<UserLogin>(AuthService.BASE_TOKEN_URL, body.toString(), { headers })
+    return this.http.post<UserLogin>(AuthService.BASE_TOKEN_URL, objectToUrlEncoded(body), { headers })
                .pipe(
                  map(res => Object.assign(res, { username })),
                  mergeMap(res => this.mergeUserInformation(res)),
index b9aa223cf67d34d4a556aa6a681c6d7aaad075a2..79c93c1b3539acb9d5b94a6d29e421b1656a4c41 100644 (file)
@@ -55,6 +55,15 @@ function immutableAssign <A, B> (target: A, source: B) {
   return Object.assign({}, target, source)
 }
 
+function objectToUrlEncoded (obj: any) {
+  const str: string[] = []
+  for (const key of Object.keys(obj)) {
+    str.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]))
+  }
+
+  return str.join('&')
+}
+
 // Thanks: https://gist.github.com/ghinda/8442a57f22099bdb2e34
 function objectToFormData (obj: any, form?: FormData, namespace?: string) {
   let fd = form || new FormData()
@@ -100,6 +109,7 @@ function isInMobileView () {
 }
 
 export {
+  objectToUrlEncoded,
   getParameterByName,
   populateAsyncUserVideoChannels,
   getAbsoluteAPIUrl,
index f419d58fc723528673788fc91bc96877d04367a2..2e77a973fa7f5a2122c84309a9d0e9447e1f71d1 100644 (file)
@@ -1,5 +1,21 @@
 import { VideoFile } from '../../../../shared/models/videos'
 
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/weak-map';
+import 'core-js/es6/set';
+import 'core-js/es7/object';
+
 import 'videojs-hotkeys'
 import 'videojs-dock'
 import './peertube-link-button'
index aa418d2d49e92ce21c41d1c9f11f889a7befa124..c882192423f196a5e95f012bc6c240100ec38a26 100644 (file)
@@ -1,5 +1,8 @@
 import './embed.scss'
 
+// For google bot that uses Chrome 41 and does not understand fetch
+import 'whatwg-fetch'
+
 import * as videojs from 'video.js'
 
 import { VideoDetails } from '../../../../shared'
index 3be3bde58b4be7b57f73707c04a952a4040f8bb7..6d905e9b32f81d35faf63d285d5b886a346324c8 100644 (file)
@@ -5214,9 +5214,9 @@ jszip@^3.1.3:
     pako "~1.0.2"
     readable-stream "~2.0.6"
 
-junk@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/junk/-/junk-2.1.0.tgz#f431b4b7f072dc500a5f10ce7f4ec71930e70134"
+junk@^1, junk@^2.1.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592"
 
 k-bucket@^4.0.0:
   version "4.0.0"
@@ -10206,7 +10206,7 @@ webtorrent@^0.98.0:
     xtend "^4.0.1"
     zero-fill "^2.2.3"
 
-whatwg-fetch@>=0.10.0:
+whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
 
index 020987920d1d63a8ef22dabdbe99f99f6cc4fc3f..a4ee9a7b251134eb5b587f58086d42cc7565323e 100644 (file)
@@ -1,4 +1,5 @@
 listen:
+  listen: '0.0.0.0'
   port: 9000
 
 webserver: