Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@ for a detailed explanation.

- `interaction.<event-name>` for events handled by a component.
- `interaction.ember-action` for closure actions.
- `interaction.link-to` for link-to execution.
19 changes: 16 additions & 3 deletions packages/ember-htmlbars/lib/components/link-to.js
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ import 'ember-runtime/system/service'; // creates inject.service
import ControllerMixin from 'ember-runtime/mixins/controller';
import layout from '../templates/link-to';
import EmberComponent, { HAS_BLOCK } from '../component';
import { flaggedInstrument } from 'ember-metal/instrumentation';


/**
`Ember.LinkComponent` renders an element whose `click` event triggers a
Expand Down Expand Up @@ -641,13 +643,24 @@ let LinkComponent = EmberComponent.extend({
return false;
}

let routing = get(this, '_routing');
let qualifiedRouteName = get(this, 'qualifiedRouteName');
let models = get(this, 'models');
let queryParamValues = get(this, 'queryParams.values');
let queryParams = get(this, 'queryParams.values');
let shouldReplace = get(this, 'replace');

routing.transitionTo(qualifiedRouteName, models, queryParamValues, shouldReplace);
let payload = {
queryParams,
routeName: qualifiedRouteName
};

flaggedInstrument('interaction.link-to', payload, this._generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace));
},

_generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace) {
let routing = get(this, '_routing');
return () => {
payload.transition = routing.transitionTo(qualifiedRouteName, models, queryParams, shouldReplace);
};
},

queryParams: null,
Expand Down
2 changes: 2 additions & 0 deletions packages/ember-routing/lib/services/routing.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ export default Service.extend({
if (shouldReplace) {
transition.method('replace');
}

return transition;
},

normalizeQueryParams(routeName, models, queryParams) {
Expand Down
11 changes: 5 additions & 6 deletions packages/ember-views/tests/system/event_dispatcher_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { runAppend, runDestroy } from 'ember-runtime/tests/utils';
import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils';
import viewKeyword from 'ember-htmlbars/keywords/view';

import { subscribe, unsubscribe } from 'ember-metal/instrumentation';
import { subscribe, reset } from 'ember-metal/instrumentation';

var owner, view, originalViewKeyword;
var dispatcher;
Expand All @@ -42,7 +42,7 @@ QUnit.module('EventDispatcher', {
teardown() {
runDestroy(view);
runDestroy(owner);

reset();
resetKeyword('view', originalViewKeyword);
}
});
Expand All @@ -66,7 +66,7 @@ if (isEnabled('ember-improved-instrumentation')) {
equal(clicked, 1, 'precond - The click handler was invoked');

let clickInstrumented = 0;
let clickSubscriber = subscribe('interaction.click', {
subscribe('interaction.click', {
before() {
clickInstrumented++;
equal(clicked, 1, 'invoked before event is handled');
Expand All @@ -78,7 +78,7 @@ if (isEnabled('ember-improved-instrumentation')) {
});

let keypressInstrumented = 0;
let keypressSubscriber = subscribe('interaction.keypress', {
subscribe('interaction.keypress', {
before() {
keypressInstrumented++;
},
Expand All @@ -94,8 +94,7 @@ if (isEnabled('ember-improved-instrumentation')) {
equal(clickInstrumented, 2, 'The click was instrumented');
strictEqual(keypressInstrumented, 0, 'The keypress was not instrumented');
} finally {
unsubscribe(clickSubscriber);
unsubscribe(keypressSubscriber);
reset();
}
});
}
Expand Down
75 changes: 74 additions & 1 deletion packages/ember/tests/helpers/link_to_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Controller from 'ember-runtime/controllers/controller';
import { set } from 'ember-metal/property_set';
import Route from 'ember-routing/system/route';
import run from 'ember-metal/run_loop';
import { subscribe, reset } from 'ember-metal/instrumentation';
import isEnabled from 'ember-metal/features';
import alias from 'ember-metal/alias';
import Application from 'ember-application/system/application';
Expand Down Expand Up @@ -76,6 +77,7 @@ function sharedSetup() {
function sharedTeardown() {
run(function() { App.destroy(); });
setTemplates({});
reset();
}

import { test } from 'ember-glimmer/tests/utils/skip-if-glimmer';
Expand Down Expand Up @@ -167,6 +169,78 @@ QUnit.test('The {{link-to}} helper moves into the named route', function() {
equal(jQuery('#home-link:not(.active)', '#qunit-fixture').length, 1, 'The other link was rendered without active class');
});

if (isEnabled('ember-improved-instrumentation')) {
QUnit.test('The {{link-to}} helper fires an interaction event', function(assert) {
assert.expect(2);
Router.map(function(match) {
this.route('about');
});

bootApplication();

run(function() {
router.handleURL('/');
});

subscribe('interaction.link-to', {
before() {
assert.ok(true, 'instrumentation subscriber was called');
},
after() {
assert.ok(true, 'instrumentation subscriber was called');
}
});

jQuery('#about-link', '#qunit-fixture').click();
});

QUnit.test('The {{link-to}} helper interaction event includes the route name', function(assert) {
assert.expect(2);
Router.map(function(match) {
this.route('about');
});

bootApplication();

run(function() {
router.handleURL('/');
});

subscribe('interaction.link-to', {
before(name, timestamp, { routeName }) {
assert.equal(routeName, 'about', 'instrumentation subscriber was passed route name');
},
after(name, timestamp, { routeName }) {
assert.equal(routeName, 'about', 'instrumentation subscriber was passed route name');
}
});

jQuery('#about-link', '#qunit-fixture').click();
});

QUnit.test('The {{link-to}} helper interaction event includes the transition in the after hook', function(assert) {
assert.expect(1);
Router.map(function(match) {
this.route('about');
});

bootApplication();

run(function() {
router.handleURL('/');
});

subscribe('interaction.link-to', {
before() {},
after(name, timestamp, { transition }) {
assert.equal(transition.targetName, 'about', 'instrumentation subscriber was passed route name');
}
});

jQuery('#about-link', '#qunit-fixture').click();
});
}

QUnit.test('The {{link-to}} helper supports URL replacement', function() {
setTemplate('index', compile(`<h3>Home</h3>{{#link-to 'about' id='about-link' replace=true}}About{{/link-to}}`));

Expand Down Expand Up @@ -1757,4 +1831,3 @@ QUnit.test('GJ: {{link-to}} to a parent root model hook which performs a `transi

shouldBeActive('#parent-link');
});

9 changes: 3 additions & 6 deletions packages/ember/tests/view_instrumentation_test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import run from 'ember-metal/run_loop';
import $ from 'ember-views/system/jquery';
import Application from 'ember-application/system/application';
import { subscribe, unsubscribe } from 'ember-metal/instrumentation';
import { subscribe, reset } from 'ember-metal/instrumentation';
import { compile } from 'ember-template-compiler/tests/utils/helpers';
import { setTemplates, set as setTemplate } from 'ember-templates/template_registry';
import { test, testModule } from 'ember-glimmer/tests/utils/skip-if-glimmer';
Expand All @@ -24,7 +24,6 @@ function handleURL(path) {
return run(router, 'handleURL', path);
}

let subscriber;
testModule('View Instrumentation', {
setup() {
run(function() {
Expand All @@ -43,9 +42,7 @@ testModule('View Instrumentation', {
},

teardown() {
if (subscriber) {
unsubscribe(subscriber);
}
reset();
run(App, 'destroy');
App = null;
setTemplates({});
Expand All @@ -54,7 +51,7 @@ testModule('View Instrumentation', {

test('Nodes without view instances are instrumented', function(assert) {
var called = false;
subscriber = subscribe('render', {
subscribe('render', {
before() {
called = true;
},
Expand Down