diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue | 17 | ||||
-rw-r--r-- | app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/ide/components/preview/clientside.vue | 23 | ||||
-rw-r--r-- | app/assets/javascripts/ide/index.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/ide/stores/state.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue | 4 | ||||
-rw-r--r-- | app/assets/javascripts/sidebar/lib/sidebar_move_issue.js | 4 | ||||
-rw-r--r-- | app/controllers/concerns/clientside_preview_csp.rb | 17 | ||||
-rw-r--r-- | app/controllers/ide_controller.rb | 1 | ||||
-rw-r--r-- | app/helpers/blob_helper.rb | 4 | ||||
-rw-r--r-- | app/helpers/ide_helper.rb | 5 | ||||
-rw-r--r-- | app/models/application_setting_implementation.rb | 6 | ||||
-rw-r--r-- | app/models/wiki_page.rb | 2 | ||||
-rw-r--r-- | app/views/projects/blob/_editor.html.haml | 3 | ||||
-rw-r--r-- | app/views/projects/blob/new.html.haml | 3 |
15 files changed, 74 insertions, 18 deletions
diff --git a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue index d304ae7dbf6..7f0c232eea8 100644 --- a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue +++ b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue @@ -4,6 +4,9 @@ import Cookies from 'js-cookie'; import { parseBoolean, scrollToElement } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; import { glEmojiTag } from '~/emoji'; +import Tracking from '~/tracking'; + +const trackingMixin = Tracking.mixin(); const popoverStates = { suggest_gitlab_ci_yml: { @@ -27,6 +30,7 @@ export default { GlIcon, GlButton, }, + mixins: [trackingMixin], props: { target: { type: String, @@ -40,10 +44,18 @@ export default { type: String, required: true, }, + humanAccess: { + type: String, + required: true, + }, }, data() { return { popoverDismissed: parseBoolean(Cookies.get(this.dismissKey)), + tracking: { + label: this.trackLabel, + property: this.humanAccess, + }, }; }, computed: { @@ -60,12 +72,17 @@ export default { mounted() { if (this.trackLabel === 'suggest_commit_first_project_gitlab_ci_yml' && !this.popoverDismissed) scrollToElement(document.querySelector(this.target)); + + this.trackOnShow(); }, methods: { onDismiss() { this.popoverDismissed = true; Cookies.set(this.dismissKey, this.popoverDismissed, { expires: 365 }); }, + trackOnShow() { + if (!this.popoverDismissed) this.track(); + }, }, }; </script> diff --git a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js index 2cc342fb381..3b67b3dd259 100644 --- a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js +++ b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js @@ -10,6 +10,7 @@ export default el => target: el.dataset.target, trackLabel: el.dataset.trackLabel, dismissKey: el.dataset.dismissKey, + humanAccess: el.dataset.humanAccess, }, }); }, diff --git a/app/assets/javascripts/ide/components/preview/clientside.vue b/app/assets/javascripts/ide/components/preview/clientside.vue index beb179d0411..aa8d932da6e 100644 --- a/app/assets/javascripts/ide/components/preview/clientside.vue +++ b/app/assets/javascripts/ide/components/preview/clientside.vue @@ -21,7 +21,7 @@ export default { }; }, computed: { - ...mapState(['entries', 'promotionSvgPath', 'links']), + ...mapState(['entries', 'promotionSvgPath', 'links', 'codesandboxBundlerUrl']), ...mapGetters(['packageJson', 'currentProject']), normalizedEntries() { return Object.keys(this.entries).reduce((acc, path) => { @@ -106,12 +106,7 @@ export default { return this.loadFileContent(this.mainEntry) .then(() => this.$nextTick()) .then(() => { - this.initManager('#ide-preview', this.sandboxOpts, { - fileResolver: { - isFile: p => Promise.resolve(Boolean(this.entries[createPathWithExt(p)])), - readFile: p => this.loadFileContent(createPathWithExt(p)).then(content => content), - }, - }); + this.initManager(); this.listener = listen(e => { switch (e.type) { @@ -139,8 +134,18 @@ export default { this.manager.updatePreview(this.sandboxOpts); }, 250); }, - initManager(el, opts, resolver) { - this.manager = new Manager(el, opts, resolver); + initManager() { + const { codesandboxBundlerUrl: bundlerURL } = this; + + const settings = { + fileResolver: { + isFile: p => Promise.resolve(Boolean(this.entries[createPathWithExt(p)])), + readFile: p => this.loadFileContent(createPathWithExt(p)).then(content => content), + }, + ...(bundlerURL ? { bundlerURL } : {}), + }; + + this.manager = new Manager('#ide-preview', this.sandboxOpts, settings); }, }, }; diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js index a3450522697..9e9d9df8f82 100644 --- a/app/assets/javascripts/ide/index.js +++ b/app/assets/javascripts/ide/index.js @@ -53,6 +53,7 @@ export function initIde(el, options = {}) { clientsidePreviewEnabled: parseBoolean(el.dataset.clientsidePreviewEnabled), renderWhitespaceInCode: parseBoolean(el.dataset.renderWhitespaceInCode), editorTheme: window.gon?.user_color_scheme || DEFAULT_THEME, + codesandboxBundlerUrl: el.dataset.codesandboxBundlerUrl, }); }, methods: { diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index a714562c5b2..0fd6a448283 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -34,4 +34,5 @@ export default () => ({ clientsidePreviewEnabled: false, renderWhitespaceInCode: false, editorTheme: DEFAULT_THEME, + codesandboxBundlerUrl: null, }); diff --git a/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue b/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue index 018b30d2a67..05ad7b4ea3e 100644 --- a/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue +++ b/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue @@ -1,6 +1,6 @@ <script> import $ from 'jquery'; -import _ from 'underscore'; +import { intersection } from 'lodash'; import '~/smart_interval'; @@ -38,7 +38,7 @@ export default { } else { changedCommands = []; } - if (changedCommands && _.intersection(subscribedCommands, changedCommands).length) { + if (changedCommands && intersection(subscribedCommands, changedCommands).length) { this.mediator.fetch(); } }, diff --git a/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js b/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js index 66d1fed7d31..2a61f7b5c05 100644 --- a/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js +++ b/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import '~/gl_dropdown'; -import _ from 'underscore'; +import { escape as esc } from 'lodash'; import { __ } from '~/locale'; function isValidProjectId(id) { @@ -49,7 +49,7 @@ class SidebarMoveIssue { renderRow: project => ` <li> <a href="#" class="js-move-issue-dropdown-item"> - ${_.escape(project.name_with_namespace)} + ${esc(project.name_with_namespace)} </a> </li> `, diff --git a/app/controllers/concerns/clientside_preview_csp.rb b/app/controllers/concerns/clientside_preview_csp.rb new file mode 100644 index 00000000000..6892c441b67 --- /dev/null +++ b/app/controllers/concerns/clientside_preview_csp.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module ClientsidePreviewCSP + extend ActiveSupport::Concern + + included do + content_security_policy do |p| + next if p.directives.blank? + next unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled? + + default_frame_src = p.directives['frame-src'] || p.directives['default-src'] + frame_src_values = Array.wrap(default_frame_src) | [Gitlab::CurrentSettings.web_ide_clientside_preview_bundler_url].compact + + p.frame_src(*frame_src_values) + end + end +end diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb index d94f18beb5d..8a838db04f9 100644 --- a/app/controllers/ide_controller.rb +++ b/app/controllers/ide_controller.rb @@ -3,6 +3,7 @@ class IdeController < ApplicationController layout 'fullscreen' + include ClientsidePreviewCSP include StaticObjectExternalStorageCSP def index diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 9c09ddafbf1..cc5ae32856a 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -353,4 +353,8 @@ module BlobHelper def suggest_pipeline_commit_cookie_name "suggest_gitlab_ci_yml_commit_#{@project.id}" end + + def human_access + @project.team.human_max_access(current_user&.id).try(:downcase) + end end diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb index e4d0e605254..d6145493ba6 100644 --- a/app/helpers/ide_helper.rb +++ b/app/helpers/ide_helper.rb @@ -10,8 +10,9 @@ module IdeHelper "promotion-svg-path": image_path('illustrations/web-ide_promotion.svg'), "ci-help-page-path" => help_page_path('ci/quick_start/README'), "web-ide-help-page-path" => help_page_path('user/project/web_ide/index.html'), - "clientside-preview-enabled": Gitlab::CurrentSettings.current_application_settings.web_ide_clientside_preview_enabled.to_s, - "render-whitespace-in-code": current_user.render_whitespace_in_code.to_s + "clientside-preview-enabled": Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?.to_s, + "render-whitespace-in-code": current_user.render_whitespace_in_code.to_s, + "codesandbox-bundler-url": Gitlab::CurrentSettings.web_ide_clientside_preview_bundler_url } end end diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb index 3f2106c80bf..d1a919fc01a 100644 --- a/app/models/application_setting_implementation.rb +++ b/app/models/application_setting_implementation.rb @@ -351,6 +351,12 @@ module ApplicationSettingImplementation static_objects_external_storage_url.present? end + # This will eventually be configurable + # https://gitlab.com/gitlab-org/gitlab/issues/208161 + def web_ide_clientside_preview_bundler_url + 'https://sandbox-prod.gitlab-static.net' + end + private def separate_whitelists(string_array) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index c6481bdbb6c..5436f034657 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -257,7 +257,7 @@ class WikiPage def title_changed? if persisted? old_title, old_dir = wiki.page_title_and_dir(self.class.unhyphenize(@page.url_path)) - new_title, new_dir = wiki.page_title_and_dir(title) + new_title, new_dir = wiki.page_title_and_dir(self.class.unhyphenize(title)) new_title != old_title || (title.include?('/') && new_dir != old_dir) else diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index cd8407608a3..51b0b2722d1 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -23,7 +23,8 @@ .js-suggest-gitlab-ci-yml{ data: { toggle: 'popover', target: '#gitlab-ci-yml-selector', track_label: 'suggest_gitlab_ci_yml', - dismiss_key: "suggest_gitlab_ci_yml_#{@project.id}" } } + dismiss_key: "suggest_gitlab_ci_yml_#{@project.id}", + human_access: human_access } } .file-buttons - if is_markdown diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index bf7900018c3..1afbe1fe24e 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -17,4 +17,5 @@ .js-suggest-gitlab-ci-yml-commit-changes{ data: { toggle: 'popover', target: '#commit-changes', track_label: 'suggest_commit_first_project_gitlab_ci_yml', - dismiss_key: "suggest_commit_first_project_gitlab_ci_yml_#{@project.id}" } } + dismiss_key: "suggest_commit_first_project_gitlab_ci_yml_#{@project.id}", + human_access: human_access } } |