summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue17
-rw-r--r--app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js1
-rw-r--r--app/assets/javascripts/ide/components/preview/clientside.vue23
-rw-r--r--app/assets/javascripts/ide/index.js1
-rw-r--r--app/assets/javascripts/ide/stores/state.js1
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue4
-rw-r--r--app/assets/javascripts/sidebar/lib/sidebar_move_issue.js4
-rw-r--r--app/controllers/concerns/clientside_preview_csp.rb17
-rw-r--r--app/controllers/ide_controller.rb1
-rw-r--r--app/helpers/blob_helper.rb4
-rw-r--r--app/helpers/ide_helper.rb5
-rw-r--r--app/models/application_setting_implementation.rb6
-rw-r--r--app/models/wiki_page.rb2
-rw-r--r--app/views/projects/blob/_editor.html.haml3
-rw-r--r--app/views/projects/blob/new.html.haml3
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 } }