Skip to content

Commit d5a8834

Browse files
committed
Move injectStyles and helpers to lib/plotcss_utils
This keeps the css directory free of Javascript. The helpers have been moved inside the plotcss_utils.js file instead of a separate helpers file. The plot API and tests have been updated accordingly. Removed duplicate tests in plot_interact_tests.js
1 parent 8717877 commit d5a8834

File tree

6 files changed

+48
-199
lines changed

6 files changed

+48
-199
lines changed

src/css/helpers.js

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/lib/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ lib.log = loggersModule.log;
6464
lib.warn = loggersModule.warn;
6565
lib.error = loggersModule.error;
6666

67+
var cssModule = require('./plotcss_utils');
68+
lib.injectStyles = cssModule.injectStyles;
69+
6770
lib.notifier = require('./notifier');
6871

6972
/**

src/css/plotcss_injector.js renamed to src/lib/plotcss_utils.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@
99

1010
'use strict';
1111

12-
var helpers = require('./helpers');
13-
var lib = require('../lib');
12+
var lib = require('./index');
1413
var plotcss = require('../../build/plotcss');
1514

1615
// Inject styling information into the document containing the graph div
17-
module.exports = function injectStyles(gd) {
16+
exports.injectStyles = function injectStyles(gd) {
1817
// If the graph div has already been styled, bail
1918
if(gd._plotCSSLoaded) return;
2019

21-
var targetSelectors = helpers.getAllRuleSelectors(gd._document);
20+
var targetSelectors = module.exports.getAllRuleSelectors(gd._document);
2221
var targetStyleSheet = null;
2322

2423
if(gd._document.getElementsByTagName('style').length === 0) {
@@ -34,7 +33,7 @@ module.exports = function injectStyles(gd) {
3433
}
3534

3635
for(var selector in plotcss) {
37-
var fullSelector = helpers.buildFullSelector(selector);
36+
var fullSelector = module.exports.buildFullSelector(selector);
3837

3938
// Don't duplicate selectors
4039
if(targetSelectors.indexOf(fullSelector) === -1) {
@@ -50,3 +49,31 @@ module.exports = function injectStyles(gd) {
5049

5150
gd._plotCSSLoaded = true;
5251
};
52+
53+
// expands a plotcss selector
54+
exports.buildFullSelector = function buildFullSelector(selector) {
55+
var fullSelector = selector.replace(/,/, ', ')
56+
.replace(/:after/g, '::after')
57+
.replace(/:before/g, '::before')
58+
.replace(/X/g, '.js-plotly-plot .plotly')
59+
.replace(/Y/g, '.plotly-notifier');
60+
61+
return fullSelector;
62+
};
63+
64+
// Gets all the rules currently attached to the document
65+
exports.getAllRuleSelectors = function getAllRuleSelectors(sourceDocument) {
66+
var allSelectors = [];
67+
68+
for(var i = 0; i < sourceDocument.styleSheets.length; i++) {
69+
var styleSheet = sourceDocument.styleSheets[i];
70+
71+
for(var j = 0; j < styleSheet.cssRules.length; j++) {
72+
var cssRule = styleSheet.cssRules[j];
73+
74+
allSelectors.push(cssRule.selectorText);
75+
}
76+
}
77+
78+
return allSelectors;
79+
};

src/plot_api/plot_api.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ var Lib = require('../lib');
1818
var Events = require('../lib/events');
1919
var Queue = require('../lib/queue');
2020

21-
var injectStyles = require('../css/plotcss_injector');
22-
2321
var Plots = require('../plots/plots');
2422
var Fx = require('../plots/cartesian/graph_interact');
2523

@@ -62,7 +60,7 @@ Plotly.plot = function(gd, data, layout, config) {
6260

6361
// Inject the plot styles into the document where we're plotting, bails if
6462
// already styled
65-
injectStyles(gd);
63+
Lib.injectStyles(gd);
6664

6765
// Events.init is idempotent and bails early if gd has already been init'd
6866
Events.init(gd);

test/jasmine/tests/plot_css_test.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var createGraphDiv = require('../assets/create_graph_div');
44
var destroyGraphDiv = require('../assets/destroy_graph_div');
55

66
describe('css injection', function() {
7-
var helpers = require('@src/css/helpers');
7+
var plotcss_utils = require('@src/lib/plotcss_utils');
88
var plotcss = require('@build/plotcss');
99

1010
// create a graph div in a child window
@@ -38,7 +38,7 @@ describe('css injection', function() {
3838
// deletes all rules defined in plotcss
3939
function deletePlotCSSRules(sourceDocument) {
4040
for(var selector in plotcss) {
41-
var fullSelector = helpers.buildFullSelector(selector);
41+
var fullSelector = plotcss_utils.buildFullSelector(selector);
4242

4343
for(var i = 0; i < sourceDocument.styleSheets.length; i++) {
4444
var styleSheet = sourceDocument.styleSheets[i];
@@ -68,10 +68,10 @@ describe('css injection', function() {
6868
var fullSelector = null;
6969

7070
// make sure the rules are cleared
71-
var allSelectors = helpers.getAllRuleSelectors(document);
71+
var allSelectors = plotcss_utils.getAllRuleSelectors(document);
7272

7373
for(selector in plotcss) {
74-
fullSelector = helpers.buildFullSelector(selector);
74+
fullSelector = plotcss_utils.buildFullSelector(selector);
7575

7676
expect(allSelectors.indexOf(fullSelector)).toEqual(-1);
7777
}
@@ -81,10 +81,10 @@ describe('css injection', function() {
8181
plot(gd);
8282

8383
// check for styles
84-
allSelectors = helpers.getAllRuleSelectors(document);
84+
allSelectors = plotcss_utils.getAllRuleSelectors(document);
8585

8686
for(selector in plotcss) {
87-
fullSelector = helpers.buildFullSelector(selector);
87+
fullSelector = plotcss_utils.buildFullSelector(selector);
8888

8989
expect(allSelectors.indexOf(fullSelector)).not.toEqual(-1);
9090
}
@@ -101,10 +101,10 @@ describe('css injection', function() {
101101
plot(gd);
102102

103103
// check for styles
104-
var allSelectors = helpers.getAllRuleSelectors(gd.ownerDocument);
104+
var allSelectors = plotcss_utils.getAllRuleSelectors(gd.ownerDocument);
105105

106106
for(var selector in plotcss) {
107-
var fullSelector = helpers.buildFullSelector(selector);
107+
var fullSelector = plotcss_utils.buildFullSelector(selector);
108108

109109
expect(allSelectors.indexOf(fullSelector)).not.toEqual(-1);
110110
}
@@ -121,10 +121,10 @@ describe('css injection', function() {
121121
var fullSelector = null;
122122

123123
// make sure the rules are cleared
124-
var allSelectors = helpers.getAllRuleSelectors(document);
124+
var allSelectors = plotcss_utils.getAllRuleSelectors(document);
125125

126126
for(selector in plotcss) {
127-
fullSelector = helpers.buildFullSelector(selector);
127+
fullSelector = plotcss_utils.buildFullSelector(selector);
128128

129129
expect(allSelectors.indexOf(fullSelector)).toEqual(-1);
130130
}
@@ -135,10 +135,10 @@ describe('css injection', function() {
135135
plot(gd); // plot again so injectStyles gets called again
136136

137137
// check for styles
138-
allSelectors = helpers.getAllRuleSelectors(document);
138+
allSelectors = plotcss_utils.getAllRuleSelectors(document);
139139

140140
for(selector in plotcss) {
141-
fullSelector = helpers.buildFullSelector(selector);
141+
fullSelector = plotcss_utils.buildFullSelector(selector);
142142

143143
var firstIndex = allSelectors.indexOf(fullSelector);
144144

test/jasmine/tests/plot_interact_test.js

Lines changed: 0 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -625,144 +625,3 @@ describe('plot svg clip paths', function() {
625625
});
626626
});
627627
});
628-
629-
describe('css injection', function() {
630-
var helpers = require('../../../src/css/helpers');
631-
var plotcss = require('../../../build/plotcss')
632-
633-
// create a graph div in a child window
634-
function createGraphDivInChildWindow() {
635-
var childWindow = window.open('about:blank', 'popoutWindow', '');
636-
637-
var gd = childWindow.document.createElement('div');
638-
gd.id = 'graph';
639-
childWindow.document.body.appendChild(gd);
640-
641-
// force the graph to be at position 0,0 no matter what
642-
gd.style.position = 'fixed';
643-
gd.style.left = 0;
644-
gd.style.top = 0;
645-
646-
return gd;
647-
}
648-
649-
// the most basic of basic plots
650-
function plot(target) {
651-
Plotly.plot(target, [{
652-
x: [1, 2, 3, 4, 5],
653-
y: [1, 2, 4, 8, 16]
654-
}], {
655-
margin: {
656-
t: 0
657-
}
658-
});
659-
}
660-
661-
// deletes all rules defined in plotcss
662-
function deletePlotCSSRules(sourceDocument) {
663-
for(var selector in plotcss) {
664-
var ruleDeleted = false;
665-
var fullSelector = helpers.buildFullSelector(selector);
666-
667-
for(var i = 0; i < sourceDocument.styleSheets.length; i++) {
668-
var styleSheet = sourceDocument.styleSheets[i];
669-
var selectors = []
670-
671-
for(var j = 0; j < styleSheet.cssRules.length; j++) {
672-
var cssRule = styleSheet.cssRules[j];
673-
674-
selectors.push(cssRule.selectorText);
675-
}
676-
677-
var selectorIndex = selectors.indexOf(fullSelector);
678-
679-
if(selectorIndex !== -1) {
680-
styleSheet.deleteRule(selectorIndex);
681-
break;
682-
}
683-
}
684-
}
685-
}
686-
687-
it('inserts styles on initial plot', function() {
688-
deletePlotCSSRules(document); // clear the rules
689-
690-
// make sure the rules are clared
691-
var allSelectors = helpers.getAllRuleSelectors(document);
692-
693-
for(var selector in plotcss) {
694-
var fullSelector = helpers.buildFullSelector(selector);
695-
696-
expect(allSelectors.indexOf(fullSelector)).toEqual(-1);
697-
}
698-
699-
// plot
700-
var gd = createGraphDiv();
701-
plot(gd);
702-
703-
// check for styles
704-
allSelectors = helpers.getAllRuleSelectors(document);
705-
706-
for(var selector in plotcss) {
707-
var fullSelector = helpers.buildFullSelector(selector);
708-
709-
expect(allSelectors.indexOf(fullSelector)).not.toEqual(-1);
710-
}
711-
712-
// clean up
713-
destroyGraphDiv();
714-
});
715-
716-
it('inserts styles in a child window document', function() {
717-
var gd = createGraphDivInChildWindow();
718-
var childWindow = gd.ownerDocument.defaultView;
719-
720-
// plot
721-
plot(gd);
722-
723-
// check for styles
724-
allSelectors = helpers.getAllRuleSelectors(gd.ownerDocument);
725-
726-
for(var selector in plotcss) {
727-
var fullSelector = helpers.buildFullSelector(selector);
728-
729-
expect(allSelectors.indexOf(fullSelector)).not.toEqual(-1);
730-
}
731-
732-
// clean up
733-
childWindow.close();
734-
});
735-
736-
it('does not insert duplicate styles', function() {
737-
deletePlotCSSRules(document); // clear the rules
738-
739-
// make sure the rules are clared
740-
var allSelectors = helpers.getAllRuleSelectors(document);
741-
742-
for(var selector in plotcss) {
743-
var fullSelector = helpers.buildFullSelector(selector);
744-
745-
expect(allSelectors.indexOf(fullSelector)).toEqual(-1);
746-
}
747-
748-
// plot
749-
var gd = createGraphDiv();
750-
plot(gd);
751-
plot(gd); // plot again so injectStyles gets called again
752-
753-
// check for styles
754-
allSelectors = helpers.getAllRuleSelectors(document);
755-
756-
for(var selector in plotcss) {
757-
var fullSelector = helpers.buildFullSelector(selector);
758-
759-
var firstIndex = allSelectors.indexOf(fullSelector);
760-
761-
// there should be no occurences after the initial one
762-
expect(allSelectors.indexOf(fullSelector, firstIndex + 1)).toEqual(-1);
763-
}
764-
765-
// clean up
766-
destroyGraphDiv();
767-
});
768-
});

0 commit comments

Comments
 (0)