Fix Bug 1506594 - Open snippet links in same window (#4563)
This commit is contained in:
Родитель
78c4062812
Коммит
4cec5cd2f1
|
@ -17,7 +17,7 @@ const ALLOWED_TAGS = {
|
||||||
* Transform an object (tag name: {url}) into (tag name: anchor) where the url
|
* Transform an object (tag name: {url}) into (tag name: anchor) where the url
|
||||||
* is used as href, in order to render links inside a Fluent.Localized component.
|
* is used as href, in order to render links inside a Fluent.Localized component.
|
||||||
*/
|
*/
|
||||||
export function convertLinks(links, sendClick, doNotAutoBlock) {
|
export function convertLinks(links, sendClick, doNotAutoBlock, openNewWindow = false) {
|
||||||
if (links) {
|
if (links) {
|
||||||
return Object.keys(links).reduce((acc, linkTag) => {
|
return Object.keys(links).reduce((acc, linkTag) => {
|
||||||
const {action} = links[linkTag];
|
const {action} = links[linkTag];
|
||||||
|
@ -25,7 +25,7 @@ export function convertLinks(links, sendClick, doNotAutoBlock) {
|
||||||
const url = action ? false : safeURI(links[linkTag].url);
|
const url = action ? false : safeURI(links[linkTag].url);
|
||||||
|
|
||||||
acc[linkTag] = (<a href={url}
|
acc[linkTag] = (<a href={url}
|
||||||
target={doNotAutoBlock ? "_blank" : ""}
|
target={openNewWindow ? "_blank" : ""}
|
||||||
data-metric={links[linkTag].metric}
|
data-metric={links[linkTag].metric}
|
||||||
data-action={action}
|
data-action={action}
|
||||||
data-args={links[linkTag].args}
|
data-args={links[linkTag].args}
|
||||||
|
@ -46,7 +46,7 @@ export function RichText(props) {
|
||||||
throw new Error(`ASRouter: ${props.localization_id} is not a valid rich text property. If you want it to be processed, you need to add it to asrouter/rich-text-strings.js`);
|
throw new Error(`ASRouter: ${props.localization_id} is not a valid rich text property. If you want it to be processed, you need to add it to asrouter/rich-text-strings.js`);
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<Localized id={props.localization_id} {...ALLOWED_TAGS} {...props.customElements} {...convertLinks(props.links, props.sendClick, props.doNotAutoBlock)}>
|
<Localized id={props.localization_id} {...ALLOWED_TAGS} {...props.customElements} {...convertLinks(props.links, props.sendClick, props.doNotAutoBlock, props.openNewWindow)}>
|
||||||
<span>{props.text}</span>
|
<span>{props.text}</span>
|
||||||
</Localized>
|
</Localized>
|
||||||
);
|
);
|
||||||
|
|
|
@ -89,6 +89,7 @@ export class SubmitFormSnippet extends React.PureComponent {
|
||||||
localization_id="disclaimer_html"
|
localization_id="disclaimer_html"
|
||||||
links={content.links}
|
links={content.links}
|
||||||
doNotAutoBlock={true}
|
doNotAutoBlock={true}
|
||||||
|
openNewWindow={true}
|
||||||
sendClick={this.props.sendClick} />
|
sendClick={this.props.sendClick} />
|
||||||
</p>);
|
</p>);
|
||||||
}
|
}
|
||||||
|
@ -105,6 +106,7 @@ export class SubmitFormSnippet extends React.PureComponent {
|
||||||
localization_id="privacy_html"
|
localization_id="privacy_html"
|
||||||
links={content.links}
|
links={content.links}
|
||||||
doNotAutoBlock={true}
|
doNotAutoBlock={true}
|
||||||
|
openNewWindow={true}
|
||||||
sendClick={this.props.sendClick} />
|
sendClick={this.props.sendClick} />
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -928,7 +928,7 @@ class _ASRouter {
|
||||||
target.browser.ownerGlobal.OpenBrowserWindow({private: true});
|
target.browser.ownerGlobal.OpenBrowserWindow({private: true});
|
||||||
break;
|
break;
|
||||||
case ra.OPEN_URL:
|
case ra.OPEN_URL:
|
||||||
target.browser.ownerGlobal.openLinkIn(action.data.args, "tabshifted", {
|
target.browser.ownerGlobal.openLinkIn(action.data.args, action.data.where || "current", {
|
||||||
private: false,
|
private: false,
|
||||||
triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
|
triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
|
||||||
});
|
});
|
||||||
|
@ -948,7 +948,7 @@ class _ASRouter {
|
||||||
case ra.SHOW_FIREFOX_ACCOUNTS:
|
case ra.SHOW_FIREFOX_ACCOUNTS:
|
||||||
const url = await FxAccounts.config.promiseSignUpURI("snippets");
|
const url = await FxAccounts.config.promiseSignUpURI("snippets");
|
||||||
// We want to replace the current tab.
|
// We want to replace the current tab.
|
||||||
target.browser.ownerGlobal.openLinkIn(url, "tabshifted", {
|
target.browser.ownerGlobal.openLinkIn(url, "current", {
|
||||||
private: false,
|
private: false,
|
||||||
triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
|
triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
|
||||||
});
|
});
|
||||||
|
|
|
@ -38,7 +38,7 @@ const ONBOARDING_MESSAGES = async () => ([
|
||||||
button_label: {string_id: "onboarding-button-label-try-now"},
|
button_label: {string_id: "onboarding-button-label-try-now"},
|
||||||
button_action: {
|
button_action: {
|
||||||
type: "OPEN_URL",
|
type: "OPEN_URL",
|
||||||
data: {args: "https://screenshots.firefox.com/#tour"},
|
data: {args: "https://screenshots.firefox.com/#tour", where: "tabshifted"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
trigger: {id: "firstRun"},
|
trigger: {id: "firstRun"},
|
||||||
|
@ -73,7 +73,7 @@ const ONBOARDING_MESSAGES = async () => ([
|
||||||
button_label: {string_id: "onboarding-button-label-try-now"},
|
button_label: {string_id: "onboarding-button-label-try-now"},
|
||||||
button_action: {
|
button_action: {
|
||||||
type: "OPEN_URL",
|
type: "OPEN_URL",
|
||||||
data: {args: "https://addons.mozilla.org/en-US/firefox/addon/ghostery/"},
|
data: {args: "https://addons.mozilla.org/en-US/firefox/addon/ghostery/", where: "tabshifted"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
targeting: "providerCohorts.onboarding == 'ghostery'",
|
targeting: "providerCohorts.onboarding == 'ghostery'",
|
||||||
|
@ -91,7 +91,7 @@ const ONBOARDING_MESSAGES = async () => ([
|
||||||
button_label: {string_id: "onboarding-button-label-get-started"},
|
button_label: {string_id: "onboarding-button-label-get-started"},
|
||||||
button_action: {
|
button_action: {
|
||||||
type: "OPEN_URL",
|
type: "OPEN_URL",
|
||||||
data: {args: await FxAccountsConfig.promiseEmailFirstURI("onboarding")},
|
data: {args: await FxAccountsConfig.promiseEmailFirstURI("onboarding"), where: "tabshifted"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
targeting: "attributionData.campaign == 'non-fx-button' && attributionData.source == 'addons.mozilla.org'",
|
targeting: "attributionData.campaign == 'non-fx-button' && attributionData.source == 'addons.mozilla.org'",
|
||||||
|
|
|
@ -840,7 +840,7 @@ describe("ASRouter", () => {
|
||||||
});
|
});
|
||||||
it("should call openLinkIn with the correct params on OPEN_URL", async () => {
|
it("should call openLinkIn with the correct params on OPEN_URL", async () => {
|
||||||
let [testMessage] = Router.state.messages;
|
let [testMessage] = Router.state.messages;
|
||||||
testMessage.button_action = {type: "OPEN_URL", data: {args: "some/url.com"}};
|
testMessage.button_action = {type: "OPEN_URL", data: {args: "some/url.com", where: "tabshifted"}};
|
||||||
const msg = fakeExecuteUserAction(testMessage.button_action);
|
const msg = fakeExecuteUserAction(testMessage.button_action);
|
||||||
await Router.onMessage(msg);
|
await Router.onMessage(msg);
|
||||||
|
|
||||||
|
@ -873,7 +873,7 @@ describe("ASRouter", () => {
|
||||||
|
|
||||||
assert.calledOnce(msg.target.browser.ownerGlobal.openLinkIn);
|
assert.calledOnce(msg.target.browser.ownerGlobal.openLinkIn);
|
||||||
assert.calledWith(msg.target.browser.ownerGlobal.openLinkIn,
|
assert.calledWith(msg.target.browser.ownerGlobal.openLinkIn,
|
||||||
"some/url", "tabshifted", {"private": false, "triggeringPrincipal": undefined});
|
"some/url", "current", {"private": false, "triggeringPrincipal": undefined});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,14 @@ describe("convertLinks", () => {
|
||||||
assert.propertyVal(result.cta.props, "data-args", cta.args);
|
assert.propertyVal(result.cta.props, "data-args", cta.args);
|
||||||
assert.propertyVal(result.cta.props, "onClick", stub);
|
assert.propertyVal(result.cta.props, "onClick", stub);
|
||||||
});
|
});
|
||||||
|
it("should follow openNewWindow prop", () => {
|
||||||
|
const cta = {url: "https://foo.com"};
|
||||||
|
const newWindow = convertLinks({cta}, sandbox.stub(), false, true);
|
||||||
|
const sameWindow = convertLinks({cta}, sandbox.stub(), false);
|
||||||
|
|
||||||
|
assert.propertyVal(newWindow.cta.props, "target", "_blank");
|
||||||
|
assert.propertyVal(sameWindow.cta.props, "target", "");
|
||||||
|
});
|
||||||
it("should allow for custom elements & styles", () => {
|
it("should allow for custom elements & styles", () => {
|
||||||
const wrapper = mount(<RichText customElements={{em: <em style={{color: "#f05"}} />}} text="<em>foo</em>" localization_id="text" />);
|
const wrapper = mount(<RichText customElements={{em: <em style={{color: "#f05"}} />}} text="<em>foo</em>" localization_id="text" />);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче